聚类索引与非聚类索引的区别

我需要添加适当的 index到我的表,需要一些帮助。

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

  • 我应该为 non-int列使用 index 吗? 为什么不呢

  • 我读了很多关于 clusterednon-clustered的索引,但是我仍然不能决定什么时候使用它们。一个好的例子将帮助我和许多其他开发人员。

我知道不应该对经常更新的列或表使用索引。在进入测试阶段之前,我还应该注意什么? 我怎样才能知道一切正常?

282252 次浏览

您应该使用索引来帮助提高 SQL 服务器的性能。通常,这意味着用于查找表中行的列将被索引。

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

拥有许多索引也是不好的。它们的维护费用很高。所以从那些显而易见的开始,然后分析看看哪些是你错过的,哪些是你能从中受益的。您从一开始就不需要它们,以后可以添加它们。

大多数列数据类型都可以在索引时使用,但索引较小的列要好于索引较大的列。另外,在列组上创建索引(例如 country + city + street)也很常见。

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

一般来说,对要用于(大量)搜索表的列使用索引,例如主键(默认情况下有聚集索引)。例如,如果您有查询(伪代码)

SELECT * FROM FOO WHERE FOO.BAR = 2

你可能需要在 FOO.BAR 上建立一个索引。应对用于排序的列使用聚集索引。聚集索引用于对磁盘上的行进行排序,因此每个表只能有一个行。例如,如果您有查询

SELECT * FROM FOO ORDER BY FOO.BAR ASCENDING

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

也许最重要的考虑因素是您的查询所花费的时间。如果查询不占用太多时间或不经常使用,那么可能不值得添加索引。一如既往,首先进行配置,然后进行优化。SQLServerStudio 可以为您提供关于在哪里进行优化的建议,MSDN 提供了一些您可能会发现有用的信息 1

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

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

2) 群集键(定义表中“聚集索引”的列)——这是一个与 身体上的存储相关的东西,在这里,一个小的、稳定的、不断增加的数据类型是你最好的选择—— INT 或 BIGINT 作为你的默认选项。

默认情况下,SQLServer 表上的主键也用作集群键-但是不需要这样!

我应用的一个经验法则是: 任何“常规”表(用于存储数据的表,即查找表等)都应该有一个集群键。真的没有必要不使用集群密钥。实际上,与通常的看法相反,拥有一个集群键实际上加速了所有常见的操作——甚至是插入和删除(因为表的组织方式不同,通常比使用 一大堆(一个没有集群键的表)更好)。

Kimberly Tripp,the Queen of Indexing 有很多关于为什么要使用集群键,以及什么样的列最适合作为集群键的优秀文章。由于每个表只有一个集群键,因此选择 集群键非常重要,而不仅仅是任何集群键。

马克

聚集索引更改行的存储方式。当您为一列(或多列)创建聚集索引时,SQL 服务器将按该列对表的行进行排序。它就像一本字典,把整本书中的所有单词按字母顺序排序。

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

非聚集索引与聚集索引的比较

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

雇员证

和一个指向 Employee 表中实际存储该值的行的指针。但是,另一方面,聚集索引实际上将存储特定 EmployeeID 的行数据——因此,如果运行查询查找15的 EmployeeID,则表中其他列的数据类似于

员工姓名、员工地址等

. 将全部存储在聚集索引本身的叶子节点中。

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

读取速度比非集群快,因为数据是按索引顺序物理存储的 我们只能为每个表创建一个(集群索引)

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