堆存储与these heaps无关。
堆只是意味着记录本身没有排序(即不相互链接)。
当您插入一条记录时,它只是被插入到数据库找到的可用空间中。
更新基于堆的表中的行不会影响其他记录(尽管会影响二级索引)
如果您在HEAP 表上创建二级索引,则RID(一种指向存储空间的物理指针)用作行指针。
聚集索引意味着记录是B-Tree 的一部分。插入记录时,B-Tree 需要重新链接。
更新聚簇表中的一行会导致 B 树的重新链接,即。 e.更新其他记录中的内部指针。
如果在聚簇表上创建二级索引,则聚簇索引键的值用作行指针。
这意味着聚集索引应该是唯一的。如果聚集索引不是唯一的,则会将一个名为 uniquifier 的特殊隐藏列附加到唯一的索引键(并且大小更大)。
还值得注意的是,在列上创建二级索引会使值或聚集索引的键成为二级索引键的一部分。
通过在聚簇表上创建索引,实际上你总是得到一个复合索引
CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)
CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)
索引IX_mytable_5678实际上是对以下列的索引:
col5
col6
col7
col8
col1
col2
col3
col4
这还有一个副作用:
聚集表上单列索引中的DESC 条件在SQL Server 中是有意义的
这个索引:
CREATE INDEX IX_mytable ON mytable (col1)
可以在这样的查询中使用:
SELECT TOP 100 *
FROM mytable
ORDER BY
col1, id
,而这个:
CREATE INDEX IX_mytable ON mytable (col1 DESC)
可以在这样的查询中使用:
SELECT TOP 100 *
FROM mytable
ORDER BY
col1, id DESC