聚簇索引和非聚簇索引之间的区别

时间:2011-02-21 19:49:13

标签: sql-server database-design indexing clustered-index non-clustered-index

我需要在表格中添加适当的index并需要一些帮助。

我很困惑,需要澄清几点:

  • 我应该为non-int列使用索引吗?为什么/为什么不

  • 我已经阅读了很多关于clusterednon-clustered索引但我还是无法决定何时使用其中一个。一个很好的例子可以帮助我和许多其他开发人员。

我知道我不应该为经常更新的列或表使用索引。我还应该注意什么呢?在进入测试阶段之前我怎么知道这一切都很好?

6 个答案:

答案 0 :(得分:272)

聚簇索引会改变存储行的方式。在列(或多个列)上创建聚簇索引时,SQL Server会按该列对表的行进行排序。它就像一本字典,所有单词都按字母顺序排列在整本书中。

另一方面,非聚集索引不会改变行存储在表中的方式。它在表中创建一个完全不同的对象,该对象包含选择用于索引的列和指向包含数据的表的行的指针。它就像一本书的最后一页中的索引,其中关键字被排序并包含书籍材料的页码,以便更快地参考。

答案 1 :(得分:81)

你真的需要分开两个问题:

1)主键是一个逻辑结构 - 唯一且可靠地标识表中每一行的候选键之一。这可以是任何东西,真的 - 一个INT,一个GUID,一个字符串 - 选择对你的场景最有意义的东西。

2)集群密钥(在表上定义“聚集索引”的一列或多列) - 这是物理存储相关的东西,在这里,一个小的,稳定的,不断增加的数据类型是您的最佳选择 - INT或BIGINT作为您的默认选项。

默认情况下,SQL Server表上的主键也用作群集键 - 但这不一定是这样!

我将应用的一条经验法则是:任何“常规”表(用于存储数据的表,即查找表等)都应该有一个聚类键。毫无疑问,没有集群密钥。实际上,与普遍认为相反,拥有一个集群密钥实际上加速了所有常见的操作 - 甚至插入和删除(因为表组织不同,通常比更好 - 没有集群的表键)。

Kimberly Tripp, the Queen of Indexing有很多关于为什么要拥有群集密钥以及哪种列最适合用作群集密钥的优秀文章。由于每个表只能获得一个,因此选择正确群集密钥至关重要 - 而不仅仅是任何群集密钥。

马克

答案 2 :(得分:26)

您应该使用索引来帮助SQL Server性能。通常这意味着用于查找表中行的列将被编入索引。

聚簇索引使SQL Server根据索引顺序对磁盘上的行进行排序。这意味着如果按聚簇索引的顺序访问数据,则数据将以正确的顺序出现在磁盘上。但是,如果经常更改具有聚簇索引的列,则行将在磁盘上移动,从而导致开销 - 这通常不是一个好主意。

拥有多个索引也不好。他们维持成本。所以从明显的开始,然后分析,看看你错过了哪些,并从中受益。你从一开始就不需要它们,以后可以添加它们。

索引时可以使用大多数列数据类型,但最好将小列索引为大型。此外,通常在列组上创建索引(例如,国家/城市+街道)。

在表格中包含大量数据之前,您不会注意到性能问题。另一件需要考虑的事情是SQL服务器需要统计信息来以正确的方式进行查询优化,因此请确保您确实生成了它。

答案 3 :(得分:20)

将非聚集索引与聚集索引与示例进行比较

作为非聚集索引的一个例子,假设我们在EmployeeID列上有一个非聚集索引。非聚集索引将存储

的值
  

雇员

AND指向Employee表中实际存储该值的行的指针。但另一方面,聚簇索引实际上将存储特定EmployeeID的行数据 - 因此,如果您正在运行查找EmployeeID为15的查询,则表中其他列的数据如

  

EmployeeName,EmployeeAddress等

。将实际存储在聚集索引本身的叶节点中。

这意味着对于非聚集索引,需要额外的工作来跟随指向表中行的指针以检索任何其他所需的值,而不是可以直接访问行的聚簇索引,因为它正在以与聚簇索引本身相同的顺序存储。因此,从聚簇索引读取通常比从非聚集索引读取更快。

答案 4 :(得分:4)

通常,在要使用(很多)的列上使用索引来搜索表,例如主键(默认情况下具有聚簇索引)。例如,如果您有查询(在伪代码中)

SELECT * FROM FOO WHERE FOO.BAR = 2

您可能希望在FOO.BAR上添加索引。应在将用于排序的列上使用聚簇索引。聚簇索引用于对磁盘上的行进行排序,因此每个表只能有一个。例如,如果您有查询

SELECT * FROM FOO ORDER BY FOO.BAR ASCENDING

您可能需要考虑FOO.BAR上的聚簇索引。

最重要的考虑因素可能是您的查询花了多少时间。如果查询不需要花费太多时间或者不经常使用,则可能不值得添加索引。一如既往,先进行配置,然后进行优化。 SQL Server Studio可以为您提供有关优化位置的建议,MSDN提供了一些您可能会觉得有用的信息{/ 3}

答案 5 :(得分:2)

读取速度比非群集快,因为数据按索引顺序进行物理分段 我们每个表只能创建一个。(集群索引)

插入和更新操作比群集索引更快。 我们可以创建n个非集群索引。