误区:很多教程或文档会提到“聚集索引是按照聚集健的某种排序(物理顺序)进行存储数据的”、“聚集索引规定数据在表中的物理存储顺序”等等。很容易让读者认为记录在聚集索引的页存储上也是有序的,这是不对的。
在聚集表中无论插入的聚集健的值是否是一个中间值,数据都是插入到数据行后面,然后通过修改偏移量来使记录在逻辑上是有序的。
为了验证这个说法,设计具体的思路:(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 0(RowID=1)是从96字节开始存储的,slot 1(RowID=2)是从207字节开始存储的,slot 2(RowID=10)是从318字节开始存储的。
我们已经大致了解了这三条数据的页存储方式,下面我们通过插入一条RowID=7的数据进行,看看页存储有什么变换
Step4:插入一条RowID=7(中间值)的数据

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

可以看到Row-Offest中Slot 0(RowID=1)是从96字节开始存储,Slot 1(RowID=2)是从207字节开始存储,Slot 2(RowID=7)是从429字节开始存储,Slot 3(RowID=10)是从318字节开始存储。RowID=7这条数据是后面插入进行的,从上述Row-Offest分析,对于页存储来说它是插在RowID=10后面,再通过偏移量来使记录在逻辑上是有序的。
聚集索引表数据页上数据行的物理顺序,仅依靠行偏移列表来决定,并不取决于在磁盘上的物理位置。




