SQL Server性能优化(10)非聚集索引的存储结构
一,新建测试表
CREATE TABLE [dbo].[Users](
[ID] [int] IDENTITY(1,1) NOT NULL,
[NAME] [char](80) NOT NULL,
[CreatTime] [datetime] NOT NULL
) ON [PRIMARY]
删除默认聚集索引,新建一个在name列上非聚集索引
插入500条数据
查看该表的页的信息
---开启跟踪标志
DBCC TRACEON(3604,2588)
--DBCC TRACEOFF(3604,2588)
---获取对象的数据页,结构:数据库、对象、显示
DBCC IND(Ixtest,users,-1)

二、查看非聚集索引的根页面
DBCC page(IxTest,1,202,3)

1. 索引根页面有五个子页面,为201~206。根据上一个图,这5个子页面Type都是2,也是索引页面,即B+树的中间节点(而不是页节点)的页面。
2. 这五个子页面,每个页包含80行数据(258-179=79,337-258=179),并且是对Name列进行划分,因为该表现在只有一个索引是Name列。
3. 倒数第二列是行定位指针,包括三部分:文件标识符(ID)+页码+页上的行数。
如何进行分析?参考文档里说:
举例第二行0x 4F000000 0100 1200除去开头的16进制标示,剩下总共8个字节,从右往左行号2个字节,文件ID2个字节,最左侧的4个字节就是页号了,所以
行号(0012)=18
文件页(0001 )=1
页号(0000004F)=59页
总结下就是,202页是非聚集索引的根页,它第二行是“张三179”,这一行指向是一个子索引页(页号201)。这个子索引页内共有80行,每一行指向1条数据。并且这80条数据的第一条的位置在1号文件里59页的18行。
二、查看非聚集索引的子索引页面
DBCC page(IxTest,1,201,3)

看下按照非聚集索引的查询计划
SET STATISTICS IO ON
SELECT * FROM Users WHERE NAME = '张三180'

总结下,非聚集索引的查询过程 (如Name = ‘张三180’)
1. 首先查找根索引页,根索引页会找自己所有的子索引,看看那个子索引包含“张三180”。这是第一次读取物理页。
2. 找到这个子索引页,在子索引页的页内,找到“张三180”所在的行。然后看到其RID的信息。这是第二次读取物理页。
3. 从硬盘读取这个页,这是第三次读取物理页。

参考
http://www.cnblogs.com/chenmh/p/4365854.html
SQL Server性能优化(10)非聚集索引的存储结构的更多相关文章
- SQL SERVER 读书笔记:非聚集索引
对于有聚集索引的表,数据存储在聚集索引的叶子节点,而非聚集索引则存储 索引键值 和 聚集索引键值.对于非聚集索引,如果查找的字段没有包含在索引键值,则还要根据聚集索引键值来查找详细数据,此谓 Book ...
- SQL Server临界点游戏——为什么非聚集索引被忽略!
当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据.我们来看看下面的表和索引定义: CREATE ...
- SQL Server性能优化(14)索引碎片
一. 外部碎片和内部碎片的概念 碎片的概念和检测,参考MSDN:https://msdn.microsoft.com/zh-cn/library/ms189858.aspx 二.对于碎片的解决办法 解 ...
- sql server临时删除/禁用非聚集索引并重新创建加回/启用的简便编程方法研究对比
前言: 由于新型冠状病毒影响,博主(zhang502219048)在2020年1月份从广东广州工作地回到广东揭阳产业转移工业园磐东街道(镇里有阳美亚洲玉都.五金之乡,素以“金玉”闻名)老家后,还没过去 ...
- SQL Server中通过设置非聚集索引(Non-Clustered index)来达到性能优化的目的
首先我们一下,在SQL Server 2014 Management Studio中,如何为一张表设置Non-Clustered index 具体可以参考 https://docs.microsof ...
- SQL Server 性能调优2 之索引(Index)的建立
前言 索引是关系数据库中最重要的对象之中的一个,他能显著降低磁盘I/O及逻辑读取的消耗,并以此来提升 SELECT 语句的查找性能.但它是一把双刃剑.使用不当反而会影响性能:他须要额外的空间来存放这些 ...
- SQL Server性能优化(15)选择合适的索引
一.关于聚集索引列的选择(参考) 1. 聚集索引所在的列,或者列的组合最好是唯一的. 当我们创建的聚集索引的值不唯一时,SQL Server则无法仅仅通过聚集索引列(也就是关键字)唯一确定一行.此时, ...
- SQL Server性能优化(6)查询语句建议
1. 如果对数据不是工业级的访问(允许脏读),在select里添加 with(nolock) ID FROM Measure_heat WITH (nolock) 2. 限制结果集的数据量,如使用TO ...
- SQL SERVER性能优化综述
SQL SERVER性能优化综述 一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的.所以我希望按照软 ...
随机推荐
- 【python深入】collections-Counter使用总结
关于collections的使用,首先介绍:Counter的使用 需要执行:from collections import Counter 在很多使用到dict和次数的场景下,Python中用Coun ...
- http协议和四个层之间的关系
TCP/IP协议的分层:应用层.传输层.网络层.数据链路层. ····应用层···· 决定了向用户提供应用服务时通信的活动.HTTP协议存在于该层.(FTP文件传输协议,DNS域名系统) ....传输 ...
- frp使用笔记
参考文档: https://github.com/fatedier/frp/blob/master/README_zh.md#%E9%80%9A%E8%BF%87-frpc-%E6%89%80%E5% ...
- Hbase 性能改进
第一种性能改进方式:
- 简单利用jQuery,让前端开发不再依赖于后端的接口
前端开发的过程中,我们免不了和后端进行联调,这时候就会出现以下的尴尬场景: 接口没写好,没法做接下来的功能 功能写好了,接口没写好,没法测这个功能 联调了,出了BUG,不知道锅在谁身上,只得陪后端耗时 ...
- @Scheduler与cron
- [c#.net]未能加载文件或程序集“”或它的某一个依赖项。系统找不到指定的文件
问题是这样嘀: 项目采用了三层架构和工厂模式,并借鉴了PetShop的架构,因为这个项目也是采用分布式的数据库,目前只有三个数据库,主要出于提高访问性能考虑. 原来是按照网上对PetShop的介绍来给 ...
- quick-cocos2d-x lua框架解析(一)对UI进行操作的UiUtil脚本
最近一段时间接手了一个cocos游戏项目,由于我是U3D开发入门,所以花了一段时间来钻研cocos2d的使用与项目架构.与U3D相比,cocos2d的开发界面实在做的不咋地.不过在看过源码之后,源码跑 ...
- ActiveMQ_7JMX
activemq配置jmx 配置activemq中的jmx可以用于监控activemq信息. activemq.xml配置 修改broker属性 添加节点managementContext <m ...
- 14. The Realities of Telecommuting 远程办公的现状
14. The Realities of Telecommuting 远程办公的现状 (1) Telecommuting——substituting the computer for the trip ...