行转移(同一行记录保存在多个页面)的疑问
自ASE12.5以来,逻辑页的大小可以在2K~16K自由设定,不同大小的逻辑页能存储的数据量也不同在插入数据时,若行大小超过逻辑页大小,则系统会报错:Attemp to update or insert row failed because resultant row of size ... is larger than...
即数据库在更新和插入时就已经不允许超过逻辑页大小的行了,行转移是如何产生的呢? 你所说的行转移是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 回复 2# shakeone
您的回答就是我要问的问题,谢谢回复,学习了:) 回复 2# shakeone
您的回答就是我要问的问题,谢谢回复,学习了:) 不客气,还有更正一点:
forwarded row通常发生在事务回滚的时候,比如删了个大的row,在它所在的page插了几个小的row,等回滚的时候会用到forwarded row的技术,一个提交的事务不会用到这个,另外用reorg forward_row可以消去这样的行,重构page
页:
[1]