我发现许许多多的帖子,其开始像相当多的时间,我所遇到的人说:“聚集索引排序物理基于聚集索引键的表里面的数据”。 这不是真的! 那么这样的帖子继续描述它是如何实际存储,通过链表或什么的。 例如,这个帖子说,
每个索引行包含一个键值和一个指向要么在B树的中间电平页,或者在索引的叶级数据行。 在指数的每个级别的页面在一个双向链表链接。 在数据链的页面和在他们行下令聚集索引键的值。
这使我想到我的问题,数据页是在表中的数据存储,正确的地方吗? 所以,如果他们是根据索引列的值进行排序,并在其中的数据也进行排序,为什么是错误的说法聚集索引保持在有序表中的数据? 下面是卡伦·德莱尼的书,这表明在一个表中的叶子页与CI均根据CI值排序的图:
你是对的。
聚簇索引不基于物理的聚集索引键的表里面的数据进行排序。 如果是这样的话,那么在插入到一个大表,没有自由空间的中间需要IO的大量以腾出空间给新的纪录。
取而代之的是新的一页是从文件中的任何位置分配并链接到链表。
到的页的物理顺序从逻辑顺序不同程度是逻辑碎片的程度。 重建或重组索引可以减少这一点。
当你创建一个索引,还有创建索引表(我认为它称为指数分配映射(IAM),不太确定的名称)在聚集索引的情况下,索引表中包含索引列,并且指针实际的记录。
所以,当一个表有一个聚集索引, 数据可能不是物理上排序表 ..在磁盘中的数据将保持为一个链表和聚簇索引是一个指针,它指向的数据。
现在,该指数表将被物理排序......不是实际table..and索引表保持为B树,从而使搜索会更快。
现在,当你创建一个非聚集索引,它会指向聚集索引表
编辑:(作为marc_s指出)聚簇索引的叶节点实际上包含的数据,其中在非聚集索引包含指针..
但我还是不相信,它会重新排序磁盘上的数据,它只是重新排序的指针
聚簇索引的索引的列排序表中的数据。 插入或更新时,每个新行将被放置在表的右侧位置。
这不与非聚集索引发生。
在这里我原来的说法是错误的
因为任何指标不表影响的数据都没有。 聚簇索引仅仅是指向表中的数据的另一个类型的索引。 它不改变顺序或做其他任何的数据。
您可以随时直接从与前行数表中获取数据,并在创建后(集群形式)指数。
原始语句的结束
需要校正 (我不使用MSSQL很多时候,所以没有机会之前测试这一点)
看来,MSSQL实现聚集索引的不是一个真正的索引,而是可能接近触发/约束对。
从我的测试原油现在:
1)
CREATE TABLE testTable ...
INSERT ... (few rows)
SELECT * FROM testTable
这表明在订单中的所有结果
2)
CREATE CLUSTERED INDEX ... ON testTable (...);
INSERT ... (few rows)
SELECT * FROM testTable
这显示以场下令所有结果CLUSTERED INDEX
3)
DROP INDEX (CLUSTERED INDEX Name) ON testTable;
INSERT ... (few rows)
SELECT * FROM testTable
这表明来自步骤2的结果)[前DROP INDEX
以相同的顺序 ]和行以后再次插入[步骤3)]中插入的顺序。
对我来说,这意味着MSSQL DOES重新排序的实际数据记录(最有可能在上插入巨大成本/删除)。
所以,我认错和斥责。 说实话我从来没想过这个(聚簇索引的行为,而不是我被证明是错误的)是这种情况。