130

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

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

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

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

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

4

6 回答 6

278

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

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

于 2011-08-21T11:48:26.997 回答
83

您确实需要将两个问题分开:

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

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

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

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

Kimberly Tripp,索引女王有很多优秀的文章,主题是为什么要有一个集群键,以及什么样的列最好用作集群键。由于每张表只有一个,因此选择正确的集群键至关重要 - 而不仅仅是任何集群键。

马克

于 2011-02-21T21:32:45.277 回答
26

您应该使用索引来提高 SQL 服务器的性能。通常这意味着用于在表中查找行的列已编入索引。

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

拥有许多索引也不好。他们需要维护。所以从明显的开始,然后分析你错过哪些并且会从中受益的。您从一开始就不需要它们,以后可以添加它们。

索引时可以使用大多数列数据类型,但是索引小列比索引大列更好。在列组(例如国家+城市+街道)上创建索引也很常见。

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

于 2011-02-21T20:02:36.217 回答
21

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

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

员工ID

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

员工姓名、员工地址等

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

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

于 2013-04-24T12:44:55.477 回答
4

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

SELECT * FROM FOO WHERE FOO.BAR = 2

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

SELECT * FROM FOO ORDER BY FOO.BAR ASCENDING

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

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

于 2011-02-21T20:07:26.000 回答
2

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

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

于 2013-06-08T15:11:17.677 回答