非聚集索引

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

非聚集索引是第二索引,你可以在表上列进行定义。你也可以把非聚集索引与书比较。但是这次你把它认为类似T-SQL 语言参考的书。书本身就是一个聚集索引,不同的T-SQL命令是按它们的名字物理排序的。在书的最后,你会看到一个索引。当你查找一个T-SQL 命令(例如 CREATE TABLE),你可以使用书最后的索引,来找到这个命令详细介绍的位置。

这里书会给你一个查找值——页码,在那里你可以找到这个命令的详细信息。这与SQL Server里(非聚集索引)的概念是一样的:但给你在执行计划里通过非聚集索引访问你的表,SQL Server会在非聚集索引的叶子层给你查找值,你可以用它找到这条记录的更多信息。SQL Server需要用这个查找值做导航,从非聚集索引到聚集索引或堆表里找到记录其他列值,这些列不是非聚集索引的一部分。在SQL Server里这个被称为书签查找(Bookmark Lookup)。我们来看看它的更多细节。

书签查找(Bookmark Lookups)

每次不在查询的执行计划里访问非聚集索引,你查询里的一些列不是非聚集索引的一部分,SQL Server需要在执行计划里进行书签查找操作。下图是一个执行计划里典型的书签查找:

可以看到,SQL Server在Person.Address表里进行非聚集查找操作。另外SQL Server通过键查找(Key Lookup)(聚集的操作从聚集表获取所有其他列。这个看起来是SQL Server里很酷的功能,但是实际上,书签查找是非常,非常,非常危险的

它们会导致书签查找死锁,性能会受老的过期的统计信息影响,当你与参数嗅探问题(Parameter Sniffing )打交道时也是。书签查找只会在与非聚集索引组合时发生。因此,下星期我们会讨论下在执行计划里如何避免书签查找,还有为什么有时候SQL Server会完全忽略你的近乎完美的非聚集索引。

聚集键依赖关系(Clustered Key Dependency)

像我刚才说过的,SQL Server在非聚集索引的叶子层保存查找值,用来指向存在聚集表或堆表的记录。当你在堆表定义了一个非聚集索引,这个查找值称为行标识者(Row-Identifier)查找值。它是8 bytes长的值,包含记录物理存储的页号(4 bytes),文件号(2 bytes),还有槽号(2 bytes)。

如果你在聚集表上定义你的非聚集索引,SQL Server使用聚集键值作为查找值。这意味你你要认真选择的聚集键列都是每个非聚集索引的一部分。在聚集和非聚集索引之间有着巨大的依赖关系。聚集键基本上是你表里的冗余数据。因此,当你选择聚集键列时,你真的需要认真考虑。因为它的强大依赖性,选择的最佳聚集键应该有3个特性:

  • 唯一的(Unique)
  • 范围小的(Narrow)
  • 静态的(Static)

用心记住它们,因为你的聚集键始终出现在每个非聚集索引里。

小结

非聚集索引对提高你的查询性能非常重要。不好非聚集索引的设计会让你引入书签查找,这会引入巨大的问题和副作用到你的数据库里。如果你想对非聚集索引内部结构有更深入的理解,可以看看下列文章


本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4502666.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
2月前
|
存储 索引
聚集索引与非聚集索引的区别
聚集索引与非聚集索引的区别
|
9月前
|
存储 数据库 索引
聚簇索引和非聚簇索引
聚簇索引和非聚簇索引
58 0
|
9月前
|
存储 Oracle 关系型数据库
主键索引是聚集索引还是非聚集索引
在聚簇索引中,主键索引的叶子节点存储的就是数据行本身,因此主键索引也被称为聚簇索引。在这种情况下,主键索引的物理顺序与数据行的物理顺序是一致的,这样可以提高查询性能和范围查询的效率。
72 0
|
存储 关系型数据库 MySQL
mysql索引(三)聚集索引与非聚集索引(辅助索引)
Mysql中常用的两个存储引擎innodb和mysiam的索引是不同的。 聚集索引就是以主键创建的索引 非聚集索引就是除了主键以外的索引。非聚集索引也叫做二级索引,不用纠结那么多名词,将其等价就行了。非聚集索引在建立的时候也未必是单列的,可以多个列来创建索引。
231 0
mysql索引(三)聚集索引与非聚集索引(辅助索引)
|
存储 关系型数据库 MySQL