据我所知:
聚集索引按索引对数据进行物理排序,因此如果您使用Surname作为聚簇索引,当您执行select *时,您将按字母顺序获取姓氏。
非聚集索引不会对您的数据库进行物理重新排序,而是创建一种按您选择的列排序的查找表。
在我的书中说,你可以有16列聚簇索引。我原以为你只能选择1列,因为它是通过物理重新排序数据库的?或者,如果第一列包含重复项,则为多列?
总是使用非聚集索引不是更快,因为SQL不需要随机播放数据吗?
答案 0 :(得分:7)
聚集索引按索引对数据进行物理排序,因此如果您使用Surname作为聚簇索引,当您执行select *时,您将按字母顺序获取姓氏。
这不一定是真的。除非您为查询提供ORDER BY
,否则无法保证订单。
在我的书中说,你可以有16列聚簇索引。我原以为你只能选择1列,因为它是通过物理重新排序数据库的?或者,如果第一列包含重复项,则为多列?
按字典顺序排序:首先是第一列,然后是第二列(如果第一列是平局等)。
总是使用非聚集索引不是更快,因为SQL不需要随机播放数据吗?
聚簇索引在INSERT
上确实有一些开销,因此有时建议使表格需要快速DML
非聚集(如日志表等)。
但是,聚簇索引允许更快地搜索群集密钥,从而加快对该密钥的连接。
答案 1 :(得分:2)
我对聚簇索引的理解 - 至少与SQL Server 2005有关 - 是行的排序实际上并不是磁盘上的物理排序。而是维护链接列表,为数据提供“逻辑”排序。因此,虽然更改聚簇索引的开销可能比非聚集索引更多,但它不会像您想象的那样有问题。
答案 2 :(得分:1)
通常,您希望聚簇索引位于唯一的,窄的,增加的列上。您很少想要对随更新而变化的任何内容进行聚类。
聚簇索引不是真正的索引,只是数据存储在树而不是堆中。
非聚集索引通常较窄,因此每页适合更多行,读取速度通常更快(显然需要覆盖才有用)。