lizhiyuan666 发表于 2009-11-4 11:48:36

行转移(同一行记录保存在多个页面)的疑问

自ASE12.5以来,逻辑页的大小可以在2K~16K自由设定,不同大小的逻辑页能存储的数据量也不同
在插入数据时,若行大小超过逻辑页大小,则系统会报错:Attemp to update or insert row failed because resultant row of size ... is larger than...
即数据库在更新和插入时就已经不允许超过逻辑页大小的行了,行转移是如何产生的呢?

shakeone 发表于 2009-11-4 20:49:03

你所说的行转移是forwarded row吗? 不然我不是很理解你要问的问题.
forwarded row和你说的问题是完全两个问题, forwarded row是指经过一次update,当前page中剩下的空隙无法容纳更新后的row了,这个row需要被移到另一个page上面去,比如我在一个page上有10个row,这个page满了,然后我执行: update tab1 set a = replicate("a",100) where a = "a"
这样的update会引起数据的膨胀,所以就会采用deferred update模式,与in place update不同的是,这种update不是直接改数据,而是先删除,再插入,所以原来page上的row会有一个pointer指向新page中的这个膨胀出来的row.
另外, 行的大小不单纯是受2K~16K的**,是受log record的**,所以对于2k的page,行的**大小是1962 bytes

lizhiyuan666 发表于 2009-11-5 11:11:34

回复 2# shakeone
您的回答就是我要问的问题,谢谢回复,学习了:)

lizhiyuan666 发表于 2009-11-5 11:11:53

回复 2# shakeone
您的回答就是我要问的问题,谢谢回复,学习了:)

shakeone 发表于 2009-11-5 20:37:36

不客气,还有更正一点:
forwarded row通常发生在事务回滚的时候,比如删了个大的row,在它所在的page插了几个小的row,等回滚的时候会用到forwarded row的技术,一个提交的事务不会用到这个,另外用reorg forward_row可以消去这样的行,重构page
页: [1]
查看完整版本: 行转移(同一行记录保存在多个页面)的疑问

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com