暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Sever聚集表的物理顺序误区

零星数据 2021-11-15
305

误区:很多教程或文档会提到“聚集索引是按照聚集健的某种排序(物理顺序)进行存储数据的”、“聚集索引规定数据在表中的物理存储顺序”等等。很容易让读者认为记录在聚集索引的页存储上也是有序的,这是不对的。

在聚集表中无论插入的聚集健的值是否是一个中间值,数据都是插入到数据行后面,然后通过修改偏移量来使记录在逻辑上是有序的。

为了验证这个说法,设计具体的思路:1)插入几条数据,观察页存储的情况,(2)再插入一条中间数据,观察页存储的变化情况

 

下面我们来看个例子

 

Step1先在Heap_NonCluster上,创建一个名为Page_Save的数据表,插入三条数据,并创建了个主键(聚集索引)

 


查看一下数据

 


 

Step2通过DBCC IND(Heap_NonCluster,Page_Save,-1)命令,查看Page_Save数据表的数据页的页号、文件号

 


Page_Save数据表的数据页的页号:243,文件号:1

 

Step3通过

DBCC TRACEON(3604)

DBCC PAGE(Heap_NonCluster,1,243,1)

命令,查看243号数据页存储的内容

 

 

可以看到我们刚插入进去三条数据都是按顺序进行存储的,slot 0RowID=1)是从96字节开始存储的,slot 1RowID=2)是从207字节开始存储的,slot 2RowID=10)是从318字节开始存储的。

 

我们已经大致了解了这三条数据的页存储方式,下面我们通过插入一条RowID=7的数据进行,看看页存储有什么变换

 

Step4插入一条RowID=7(中间值)的数据


可以看到RowID=7的这条数据已经排在RowID=10的前面,我们通过分析页面内容看看是怎么实现这个RowID的排序(物理顺序)的

 

Step5再查看243号数据页存储的内容

 


可以看到Row-OffestSlot 0RowID=1)是从96字节开始存储,Slot 1RowID=2)是从207字节开始存储,Slot 2RowID=7)是从429字节开始存储,Slot 3RowID=10)是从318字节开始存储。RowID=7这条数据是后面插入进行的,从上述Row-Offest分析,对于页存储来说它是插在RowID=10后面,再通过偏移量来使记录在逻辑上是有序的。

 

聚集索引表数据页上数据行的物理顺序,仅依靠行偏移列表来决定,并不取决于在磁盘上的物理位置。


文章转载自零星数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论