聚簇索引与非聚簇索引之间的区别
我需要添加适当的索引到我的表,需要一些帮助。
我很困惑,需要澄清几点:
-
我应该使用索引非int列吗? 为什么/为什么不
-
我已经读了很多关于聚集索引和非聚集索引的知识,但是我仍然不能决定何时使用索引。 一个很好的例子会帮助我和其他许多开发者。
我知道我不应该使用经常更新的列或表的索引。 还有什么我应该注意的,我怎么能知道在进入testing阶段之前,这一切都很好?
你真的需要分开两个问题:
1) 主键是一个逻辑结构 – 唯一可靠地标识表中每一行的候选键之一。 这可以是任何东西,真的 – 一个INT,一个GUID,一个string – select最适合你的场景。
2) 集群密钥 (在表中定义“聚集索引”的列或列) – 这是一个物理存储相关的东西,在这里,一个小的,稳定的,不断增长的数据types是你最好的select – INT或BIGINT作为默认选项。
默认情况下,SQL Server表上的主键也被用作集群键 – 但这并不需要那样!
我将要应用的一个经验法则是:任何“常规”表(用于存储数据的表,即查找表等)都应该有一个集群键。 有没有一个集群的关键是没有意义的。 实际上,与普遍认为的相反,拥有一个集群密钥实际上加速了所有常见的操作 – 甚至是插入和删除(因为表组织是不同的,通常比使用堆的表更好 – 没有集群键的表)。
索引的女王金伯利·特里普(Kimberly Tripp)在关于为什么要有一个集群密钥以及什么样的列最适合用作集群密钥这个话题上有很多优秀的文章。 由于每个表只能得到一个,因此select正确的集群密钥至关重要 – 而不仅仅是集群密钥。
- GUID作为PRIMARY KEY和/或集群密钥
- 聚集指数的争论仍在继续
- 不断增加的集群密钥 – 聚集索引辩论……….再次!
- 磁盘空间很便宜 – 这不是重点!
渣子
聚集索引改变了行的存储方式。 在列(或多列)上创build聚簇索引时,SQL Server将按该列对表的行进行sorting。 它就像一本字典,所有单词在整本书中按字母顺序sorting。
另一方面,非聚集索引不会改变表中行的存储方式。 它在表格中创build一个完全不同的对象,其中包含为索引select的列和指向包含数据的表的行的指针。 它就像一本书的最后几页的索引,其中关键字被sorting,并包含书本材料的页码以供参考。
这是一个非常好的细节(来源): http : //www.itbully.com/node/66
您应该使用索引来帮助SQL Server性能。 通常这意味着用于查找表中的行的列被索引。
聚簇索引使SQL服务器按照索引顺序对磁盘上的行进行sorting。 这意味着如果您按照聚簇索引的顺序访问数据,则数据将以正确的顺序出现在磁盘上。 但是,如果具有聚集索引的列经常发生更改,则该行将在磁盘上移动,从而导致开销 – 这通常不是一个好主意。
有很多指标也不好。 他们花费维护。 因此,从明显的开始,然后简介,看看你错过了哪些,将从中受益。 你从开始就不需要它们,以后可以添加它们。
索引时可以使用大多数列数据types,但索引较大的小列更好。 在列组(例如,国家+城市+街道)上创build索引也是很常见的。
除非表中有相当多的数据,否则您将不会注意到性能问题。 还有一件事要考虑的是,SQL服务器需要统计信息来正确地进行查询优化,因此请确保生成该查询。
比较非聚集索引与聚集索引的例子
作为一个非聚集索引的例子,假设我们在EmployeeID列上有一个非聚集索引。 非聚集索引将同时存储
员工ID
以及指向实际存储该值的Employee表中的行的指针。 但另一方面,聚集索引将实际存储特定EmployeeID的行数据 – 因此,如果您正在运行查找EmployeeID为15的查询,则表中其他列的数据就像
EmployeeName,EmployeeAddress等
。 将全部实际存储在聚集索引本身的叶节点中。
这意味着对于非聚集索引来说,额外的工作需要遵循指向表中的行的指针来检索任何其他期望的值,而不是聚集索引,它可以直接访问行,因为它存储在与聚集索引本身的顺序相同。 因此,从聚集索引读取通常比从非聚集索引读取要快。
一般来说,在一个将被用来(很多)的列上使用索引来search表,比如主键(默认情况下有一个聚集索引)。 例如,如果您有查询(伪代码)
SELECT * FROM FOO WHERE FOO.BAR = 2
你可能想把一个索引放在FOO.BAR上。 聚簇索引应该用于将用于sorting的列。 聚簇索引用于对磁盘上的行进行sorting,因此每个表只能有一个。 例如,如果你有查询
SELECT * FROM FOO ORDER BY FOO.BAR ASCENDING
您可能需要考虑FOO.BAR上的聚簇索引。
可能最重要的考虑是你的查询花了多less时间。 如果一个查询不需要太多时间或者不经常使用,那么可能不值得添加索引。 一如既往,首先configuration文件,然后优化。 SQL Server Studio可以给你build议优化的地方,MSDN有一些你可能会觉得有用的信息
由于数据在索引顺序中被物理分级,我们只能为每个表创build一个数据,所以读取速度比非群集快(群集索引)
插入和更新操作比群集索引更快。 我们可以创buildn个非集群索引。