|
最初由 grassbell 发布
[B]又重温了一遍,发现这个帖子也清楚地表现了 row chaining 和 row migration 两个概念。另外,提出了自己的问题。
biti_rainy said:
2:当删除记录后的空间,如果新插入的数据能容纳进去,则重用
我这里的观点2 不是针对 freelist 的,一个block本身位于freelist中,但在block中因为delete而释放出来的空间能被insert 重用,也就是说block的空间的利用对于insert不是 循环使用的,是从tail 到 header凡是能容纳的空间都可以使用,但在update而言,却都始终是提升到靠近 header一侧的
And my question:
我注意到,虽然row都是从block的底部向header方向插入,但是用insert into tn select ......一次性插入多行,则是从header向tail方向插入的。
问题是:你首先删除了6,7两行,又插入了(19,'q') 和(19,'qqq'); 虽然这两行都比先前删除的两行短,足可以利用原来的空间。实际的情况只是(19,'qqq') 重用了第6行在row dictionary中的row entry,但新插入的两行的物理位置都在第0行的物理位置之上(靠近row header,这时的插入方向是对的)。也就是并没有重用删除的空间。 [/B]
thanks ,我测试的时候没有注意只是使用了 row dictionary 而没有使用删除部分的空间。 多谢指出。 |
|