有部分初学者在看oracle docs中关于row format的描述时可能会有个疑问,既然row会移动或链接,那它在不同的block中的部分的地址是不是会变化?
要解答这个问题,还得从rowid的结构说起
<这里需补充rowid的结构说明>
显然rowid是包括了block address的,既然一个记录行被分布到了不同的block,那这几个不同的部分当然具有不同的rowid
下面再引申说明row的格式组成
1,我们知道,row是由一个或多个piece组成的,下面是一些基本的规则
2, 如果columns <256,且能在一个block中存储,那么只有一个 piece
3, 如果columns>=256,且能在一个block存储,那么每行的第256列以后形成的piece会与1-255列组成的piece 链接在一起,这种情况叫做intra-blockchaining; 即跨内链接
4, 如果不能在一个block中存储,那么就会有多个pieces chained在一起.每个piece在一个block中; 或者原来以一个piece存储在一个block中,后来因update,导致在一个block中存储不下,必须跨块存储; 这种情况是跨块链接
不管是块内链接还是块间链接,piece之间都是通过piece的rowid来连接的,实际上相当于一个单向链表
所以不难理解row piece的格式中包括了"Rowid of chained row pieces":
Row Overhead
Number of Columns
Cluster Key ID (if clustered)
ROWID of Chained Row Pieces (if any)
Column Length
Column Value
当我们根据rowid 来fetch有多个piece的行时(select,update,delete)
server process只需要找到第一个piece的rowid即可,因为它的header中包含有下一个piece的rowid,如此类推;process可以根据这个关系拿到所有的piece然后组装起来,返回给用户
有关row format及在row在cluster的情况下的表现可以参见<
有空再补充dump块来验证上述规则的测试过程
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29424472/viewspace-1182909/ ,如需转载,请注明出处,否则将追究法律责任。