我需要在index
我的表格中添加适当的内容并需要一些帮助。
我很困惑,需要澄清几点:
我应该对
non-int
列使用索引吗?为什么/为什么不我已经阅读了很多关于
clustered
和non-clustered
索引的内容,但我仍然无法决定何时使用其中一个。一个很好的例子会帮助我和许多其他开发人员。
我知道我不应该对经常更新的列或表使用索引。在进入测试阶段之前,我还应该注意什么?我怎么知道一切都很好?
我需要在index
我的表格中添加适当的内容并需要一些帮助。
我很困惑,需要澄清几点:
我应该对non-int
列使用索引吗?为什么/为什么不
我已经阅读了很多关于clustered
和non-clustered
索引的内容,但我仍然无法决定何时使用其中一个。一个很好的例子会帮助我和许多其他开发人员。
我知道我不应该对经常更新的列或表使用索引。在进入测试阶段之前,我还应该注意什么?我怎么知道一切都很好?
聚集索引改变了行的存储方式。当您在一列(或多列)上创建聚集索引时,SQL Server 按该列对表的行进行排序。它就像一本字典,整本书中的所有单词都按字母顺序排列。
另一方面,非聚集索引不会改变行在表中的存储方式。它在表中创建一个完全不同的对象,该对象包含选择用于索引的列和指向包含数据的表行的指针。它就像一本书最后几页的索引,其中关键字被排序并包含书籍材料的页码,以便更快地参考。
您确实需要将两个问题分开:
1)主键是一个逻辑构造 - 唯一且可靠地标识表中每一行的候选键之一。这可以是任何东西,真的 - 一个 INT、一个 GUID、一个字符串 - 选择对您的场景最有意义的东西。
2)聚集键(定义表上“聚集索引”的列)——这是与物理存储相关的东西,在这里,一个小的、稳定的、不断增长的数据类型是你最好的选择——INT或 BIGINT 作为您的默认选项。
默认情况下,SQL Server 表上的主键也用作集群键 - 但不需要这样!
我要应用的一条经验法则是:任何“常规”表(用于存储数据的表,即查找表等)都应该有一个集群键。没有集群键真的没有意义。实际上,与普遍认为的相反,拥有集群键实际上加速了所有常见操作 - 甚至是插入和删除(因为表组织不同并且通常比使用堆更好- 没有集群键的表)。
Kimberly Tripp,索引女王有很多优秀的文章,主题是为什么要有一个集群键,以及什么样的列最好用作集群键。由于每张表只有一个,因此选择正确的集群键至关重要 - 而不仅仅是任何集群键。
马克
您应该使用索引来提高 SQL 服务器的性能。通常这意味着用于在表中查找行的列已编入索引。
聚集索引使 SQL Server 根据索引顺序对磁盘上的行进行排序。这意味着如果您按照聚集索引的顺序访问数据,那么数据将以正确的顺序出现在磁盘上。但是,如果具有聚集索引的列经常更改,那么行将在磁盘上移动,从而导致开销——这通常不是一个好主意。
拥有许多索引也不好。他们需要维护。所以从明显的开始,然后分析你错过哪些并且会从中受益的。您从一开始就不需要它们,以后可以添加它们。
索引时可以使用大多数列数据类型,但是索引小列比索引大列更好。在列组(例如国家+城市+街道)上创建索引也很常见。
此外,除非您的表中有相当多的数据,否则您不会注意到性能问题。另一件要考虑的事情是 SQL 服务器需要统计信息才能以正确的方式进行查询优化,因此请确保您确实生成了它。
非聚集索引与聚集索引的比较与示例
作为非聚集索引的示例,假设我们在 EmployeeID 列上有一个非聚集索引。非聚集索引将存储
员工ID
AND 指向 Employee 表中实际存储该值的行的指针。但另一方面,聚集索引实际上将存储特定 EmployeeID 的行数据——因此,如果您正在运行查找 EmployeeID 为 15 的查询,则表中其他列的数据如
员工姓名、员工地址等
. 实际上将全部存储在聚集索引本身的叶节点中。
这意味着对于非聚集索引,需要额外的工作来跟随指向表中行的指针以检索任何其他所需的值,而不是聚集索引,因为它存储在与聚集索引本身的顺序相同。因此,从聚集索引读取通常比从非聚集索引读取要快。
通常,在将要(大量)使用的列上使用索引来搜索表,例如主键(默认情况下具有聚集索引)。例如,如果您有查询(在伪代码中)
SELECT * FROM FOO WHERE FOO.BAR = 2
您可能想在 FOO.BAR 上放置一个索引。应该在将用于排序的列上使用聚集索引。聚集索引用于对磁盘上的行进行排序,因此每个表只能有一个。例如,如果您有查询
SELECT * FROM FOO ORDER BY FOO.BAR ASCENDING
您可能需要考虑在 FOO.BAR 上使用聚集索引。
可能最重要的考虑因素是您的查询花费了多少时间。如果查询不需要太多时间或不经常使用,则可能不值得添加索引。与往常一样,首先配置文件,然后进行优化。SQL Server Studio 可以为您提供优化的建议,MSDN 提供了一些您可能会觉得有用的信息1
比非集群读取更快,因为数据是按索引顺序物理存储的,我们每个表只能创建一个。(集群索引)
插入和更新操作比集群索引更快。我们可以创建 n 个非聚集索引。