SQL Server索引 - 非聚集索引 <第七篇>
一、非聚集索引维护
非聚集索引的行定位器值保持相同的聚集索引值,即使该聚集索引列物理上重新定位后,也是如此。
为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割之后指向新的数据页面,而不是更新所有相关非聚集索引的行定位器。这样,虽然降低了非聚集索引的维护开销,但是增加了从非聚集索引行到数据行的导航开销,因为添加了一个旧数据页面和信数据页面之间的连接。因此,将聚集索引作为行定位器降低了非聚集索引相关的开销。
二、定义书签查找
当一个查询请求不是优化器选择的非聚集索引一部分的列时,需要一个查找。这对一个聚集索引来说是一个关键字查找,堆堆表来说是一个RID查找。这些查找的统称来自于旧的定义名 - 书签查找。这种查找根据非聚集索引的行定位器值,从表中读取对应的数据行,除了索引页面上的逻辑读操作意外,还需要一个数据页面上的逻辑读。但是,如果查询需要的列在索引中,那么就不需要访问数据页面。这被称为覆盖索引。
这些书签查找是大结果集最好使用聚集索引的原因。聚集索引不需要书签查找,因为叶子页面就是数据页面。
三、非聚集索引的建议
因为表只能有一个聚集索引,所以可以使用多个非聚集索引的灵活性来帮助改进性能。下面将说明非聚集索引使用的决定因素。
1、何时使用非聚集索引
非聚集索引在需要从一个大表上读取少量的行的时候最有用,随着需要检索的行数量的增加,书签查找的开销成比例增加。为了从表中检索少量的行,索引列应该有很高的选择性。
适合使用非聚集索引的情况:
- 列具有高选择性;
- 根据列获取少量数据;
- 窄列;
- 列经常被分组排序;
下面给出不适合建立聚集索引,但也能够使用聚集索引的情况
- 频繁更新的列;
- 宽类型列;
聚集索引频繁更新是非常消耗资源的,因为会影响表的顺序,同时也影响到其他索引,在频繁更新的列上的非聚集索引的开销不像聚集索引那么大。在非聚集索引上的更新操作被限定在基本表和非聚集索引上,它不影响表上的其他非聚集索引。
宽类型列也类似,非聚集索引列上使用宽类型,虽影响比如聚集索引那么大,但是也要小心使用。
2、何时不使用聚集索引
非聚集索引不适合于大量行的查询。这样的查询使用聚集索引更好,聚集索引不需要大量的书签查找,而非聚集索除了在索引列上检索的逻辑读外,书签查找也需要消耗太多资源。SQL Server查询优化器在检索大结果集时会考虑这一开销,并相应地放弃该非聚集索引。
不适合建非聚集索引的情况:
获取大量数据;
低选择性;
SQL Server索引 - 非聚集索引 <第七篇>的更多相关文章
- SQL Server的非聚集索引中会存储NULL吗?
原文:SQL Server的非聚集索引中会存储NULL吗? SQL Server的非聚集索引中会存储NULL吗? 这是个很有意思的问题,下面通过如下的代码,来说明,到底会不会存储NULL. --1.建 ...
- 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?
写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- Mysql 索引实现原理. 聚集索引, 非聚集索引
Mysql索引实现: B-tree,B是balance,一般用于数据库的索引.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.而B+tree是B-tree的一个变种,My ...
- SQL SERVER 聚集索引 非聚集索引 区别
转自http://blog.csdn.net/single_wolf_wolf/article/details/52915862 一.理解索引的结构 索引在数据库中的作用类似于目录在书籍中的作用,用来 ...
- SQL Server中的聚集索引(clustered index) 和 非聚集索引 (non-clustered index)
本文转载自 http://blog.csdn.net/ak913/article/details/8026743 面试时经常问到的问题: 1. 什么是聚合索引(clustered index) / ...
- 在SQL Server里禁用聚集索引——真的好么?
有人问了我一个最有意思的问题:“你能禁用聚集索引么?” 对这个问题,我先是吓了一跳,因为我从未想过禁用聚集索引,因为聚集索引代表表数据,对这个最有趣问题,我立即答道:“我认为可以,但是...” 好吧, ...
- Entity Framework Code First+SQL Server,改变聚集索引,提高查询性能
.net Entity Framework(调研的是Entity Framework 4.0) code first方式生成数据库时,不能修改数据库表的索引,而SQLServer默认会把数据表的主键设 ...
- SQL点点滴滴_非聚集索引设计指南-转载
非聚集索引包含索引键值和指向表数据存储位置的行定位器. 有关非聚集索引体系结构的详细信息, 请参阅 非聚集索引结构. 可以对表或索引视图创建多个非聚集索引. 通常, 设计非聚集索引是为改善经常使用的没 ...
随机推荐
- csdn的下载链接token
qt之QComboBox定制 http://www.cnblogs.com/swarmbees/p/5710714.html http://download.csdn.net/detail/qq_30 ...
- uva 10706 Number Sequence(数学规律)
题目连接:10706 - Number Sequence 题目大意:有一个有0 ~ 9组成的序列,1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 ....就是第一位为1. ...
- GET: https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login? loginicon=true &uuid=odcptUu2JA==&tip=0
GET: https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login? loginicon=true &uuid=odcptUu2JA==&am ...
- [转]ReactJS入门教程
Refference From:http://www.cocoachina.com/webapp/20150721/12692.html 现在最热门的前端框架有AngularJS.React.Boot ...
- proxy 利用get拦截,实现一个生成各种DOM节点的通用函数dom。
const dom = new Proxy({}, { get(target, property) { return function(attrs = {}, ...children) { const ...
- javascript 将递归转化为循环
function tco(f) { var value; var active = false; var accumulated = []; return function accumulator() ...
- Jenkins动态部署方案
在之前一个项目开发中使用到了jenkins自动化测试,根据实际应用,简单整理了其部署方案. 1.部署 2.项目构建 3.重部署 1 部署 登录Jenkins应用管理界面 1)选中一个服务器上已在jen ...
- VC调试笔记
1.windows-32调试: ①使用map文件根据崩溃地址寻找对应的源代码文件和行号 勾选project->settings->link->General mapfile,对应的P ...
- 达到XML简单的动态配置
今天写的XML相关内容:随着上述眼前的小项目(等级类别)由于地图每个级别.因此,让他动态读取XML内容,这样的变化只能看到XML档. 简单的想法:第一次使用UserDefault类写入文件 UserD ...
- Android应用程序键盘(Keyboard)消息处理机制分析
在Android系统中,键盘按键事件是由WindowManagerService服务来管理的,然后再以消息的形 式来分发给应用程序处理,不过和普通消息不一样,它是由硬件中断触发的:在上一篇文章< ...