非聚集索引

本文涉及的产品
云数据库 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,如需转载请自行联系原作者

相关文章
|
Android开发 索引 容器
【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
448 0
|
11月前
|
存储 前端开发 Java
【Bistoury】Bistoury功能分析-在线debug
Bistoury是由去哪儿网开源的一款应用诊断工具,适用于Java应用的在线调试。通过增强字节码,Bistoury能够在不停止应用的情况下设置断点并获取执行信息。启动被调试应用后,使用`quick_start.sh`命令启动Bistoury,并通过浏览器访问`localhost:9091`进行调试。默认账号密码为admin。Bistoury通过ASM字节码增强技术确保行号一致性,并利用行增强技术收集局部变量及调用栈信息。尽管社区已不活跃,但其设计理念仍具参考价值。
160 0
【Bistoury】Bistoury功能分析-在线debug
|
11月前
|
安全 Shell 网络安全
设置 码云 SSH 推送和拉取代码
设置 码云 SSH 推送和拉取代码
428 0
|
11月前
|
JavaScript 测试技术 UED
让浏览器支持<style scoped>
【10月更文挑战第5天】
|
消息中间件 存储 编解码
Kratos微服务框架下的消息队列应用
Kratos微服务框架下的消息队列应用,包括了:Kafka、Rabbitmq、mqtt、redis,nats,websocket等。
2773 1
|
JavaScript Linux 开发工具
C语言实现的开源 2D 格斗游戏: Punch Kick
Punch & Kick》是作者在大学期间用C语言开发的2D格斗游戏,其开源主要是面向开发者及编程爱好者,这款游戏并不适合发烧级玩家、审美帝。
499 0
|
人工智能 算法
智能logo免费体验|如何让餐饮logo在点评网站上一眼出众?
一个新的餐饮店铺,还没有人知晓,Logo就是这个重要的“门面”,所传递的信息让人快速识别,就能产生记忆点,愿意进一步了解,从而为店铺带来流量和收益。如何让你的餐饮店铺logo具备吸引力,在茫茫竞争中一眼出众,为你带来生意呢? 阿里云智能logo设计,在线免费体验logo制作:https://logo.aliyun.com/logo
595 0
智能logo免费体验|如何让餐饮logo在点评网站上一眼出众?
|
JavaScript 前端开发
nodejs ES6模块使用 以及 ES6代码转CJS兼容性处理
nodejs ES6模块使用 以及 ES6代码转CJS兼容性处理
nodejs ES6模块使用 以及 ES6代码转CJS兼容性处理
|
Linux 数据安全/隐私保护
root权限的使用和启用
安装完 kali_linux_2020 后默认使用的是安装时创建的非 root 用户,由于 Linux 很多操作和工具的安装都需要用到 root 权限。所以使用 kali root 权限的使用很重要。
root权限的使用和启用
|
人工智能 安全 机器人
深度长文:利用 Power Automation 实现企业数字化转型
深度长文:利用 Power Automation 实现企业数字化转型
582 0
深度长文:利用 Power Automation 实现企业数字化转型