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

Pab*_*buc 126 sql-server indexing database-design clustered-index non-clustered-index

我需要添加适当的index表格,需要一些帮助.

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

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

  • 我已经读了很多关于clusterednon-clustered指数但我仍然不能确定何时使用一个比其他.一个很好的例子可以帮助我和许多其他开发人员.

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

小智 273

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

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


mar*_*c_s 82

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

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

2)聚类键(在表上定义"聚簇索引"的一列或多列) - 这是一个与物理存储相关的东西,这里,一个小的,稳定的,不断增加的数据类型是你最好的选择 - INT或BIGINT作为默认选项.

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

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

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

  • 未标记为主键的 Identity 列呢?是集群的吗? (2认同)
  • @ProgrammerIT:**不** - `IDENTITY` 列只是一个系统生成的值。没有其他的。 (2认同)

And*_*rin 26

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

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

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

索引时可以使用大多数列数据类型,但最好是将小列索引为大型.此外,通常在列组上创建索引(例如country + city + street).

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

  • 还有2点...默认情况下,向表中添加主键时,它是聚簇索引.其次,您只能拥有1个聚簇索引. (4认同)

Eri*_*est 20

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

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

员工ID

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

EmployeeName,EmployeeAddress等

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

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