关于SQL索引的问题

时间:2010-06-28 13:16:40

标签: sql sql-server

据我所知:

聚集索引按索引对数据进行物理排序,因此如果您使用Surname作为聚簇索引,当您执行select *时,您将按字母顺序获取姓氏。

非聚集索引不会对您的数据库进行物理重新排序,而是创建一种按您选择的列排序的查找表。

在我的书中说,你可以有16列聚簇索引。我原以为你只能选择1列,因为它是通过物理重新排序数据库的?或者,如果第一列包含重复项,则为多列?

总是使用非聚集索引不是更快,因为SQL不需要随机播放数据吗?

3 个答案:

答案 0 :(得分:7)

  

聚集索引按索引对数据进行物理排序,因此如果您使用Surname作为聚簇索引,当您执行select *时,您将按字母顺序获取姓氏。

这不一定是真的。除非您为查询提供ORDER BY,否则无法保证订单。

  

在我的书中说,你可以有16列聚簇索引。我原以为你只能选择1列,因为它是通过物理重新排序数据库的?或者,如果第一列包含重复项,则为多列?

按字典顺序排序:首先是第一列,然后是第二列(如果第一列是平局等)。

  

总是使用非聚集索引不是更快,因为SQL不需要随机播放数据吗?

聚簇索引在INSERT上确实有一些开销,因此有时建议使表格需要快速DML非聚集(如日志表等)。

但是,聚簇索引允许更快地搜索群集密钥,从而加快对该密钥的连接。

答案 1 :(得分:2)

我对聚簇索引的理解 - 至少与SQL Server 2005有关 - 是行的排序实际上并不是磁盘上的物理排序。而是维护链接列表,为数据提供“逻辑”排序。因此,虽然更改聚簇索引的开销可能比非聚集索引更多,但它不会像您想象的那样有问题。

答案 2 :(得分:1)

通常,您希望聚簇索引位于唯一的,窄的,增加的列上。您很少想要对随更新而变化的任何内容进行聚类。

聚簇索引不是真正的索引,只是数据存储在树而不是堆中。

非聚集索引通常较窄,因此每页适合更多行,读取速度通常更快(显然需要覆盖才有用)。