SQL Server 索引基本概念与优化
数据页和区
- 页
SQL Server 中的数据以“页”(Page)的形式保存数据,页是SQL Server 的IO单位,读/写一次至少是一页。一页为8K(8192byte).
页由三部分组成,页头,数据和偏移量。页头大小是96byte,记录页号,所属对象和页类型(IAM,DataPage,IndexPage),数据部分是8060byte,用来存放实际数据。偏移量36byte,也叫“slot”,用来标记每一行数据的位置
- 区
一个区=8个连续的页。
B树和索引键
B树(Balanced-Tree) 平衡多路查找树结构
- 含有一个跟节点(root node)
- 若干非页叶节点(none-leaf node)
- 最后一层为叶节点(leaf node),一个索引仅有一层(最后一层)叶子节点
- 根节点和非叶节点存放按顺序排列的键值(建索引的行)。对于聚集索引,叶子节点存放实际的数据行(所以只有一个聚集索引),而对于非聚集索引,叶子节点存放键值和书签(RID,记录文件号,页号和slot号)
索引碎片和填充因子
- 分页:当发生插入或者更新操作时,如果数据页已经不够空间容纳新数据,就会发生分页,即新建一页来存放新数据。
- 正向记录(forwarded records): 发生在堆表(即没有索引的表)中,在旧页中放一个指针指向新页,在新页中放置新数据和一个指向旧页的指针。
- 页拆分(Page Split): 发生在索引(聚集索引和非聚集索引的数据页中),当插入或更新数据时,如果数据页已经没有空间放置新数据,就会新建一页,将旧页中一半的数据移动到新页中,同时在旧页中放置新数据,如果还不够空间,则继续拆分。
- 索引碎片:当发生分页情况时,新页有可能和旧页不是连续的,例如隔开了N个页或者N个区,这样就形成了碎片。碎片增加了磁盘IO数量,原来读100条数据只需读10页,但有碎片情况下有可能需要读20页或更多(虽然一次IO最小是一个页,但一般一次都不止一个页)
(上图为Careyson的原创图片)
- 如何减少分页
- 使用自增ID。自增ID具有连续性,插入的新数据页通常位于索引数据页尾部。而使用类似newid()产生的GUID因为字母具有随机性,容易在索引叶子页的中间段插入,导致页不连续而产生碎片。
- 重新生成或重新组织索引。重生生成索引会删除原来的索引并且重新建立新索引。重组索引会对叶子页进行物理排序,使其连续。
- 填充因子。 提供填充因子选项是为了优化索引数据存储和性能。当创建或重新生成索引时,填充因子的值可确定每个叶级页上要填充数据的空间百分比,以便在每一页上保留一些剩余空间作为以后扩展索引的可用空间。例如,指定填充因子的值为 80 表示每个叶级页上将有 20% 的空间保留为空,以便随着向基础表中添加数据而为扩展索引提供空间。在索引行之间保留可用空间,而不是在索引的末尾保留。
(上图为Careyson的原创图片)
(上图为Careyson的原创图片)
索引监控统计信息
一般是使用动态管理对象(DMO)
- 索引统计信息:记录索引使用情况和索引碎片情况
sys.dm_db_index_usage_stats
用于统计索引使用情况,例如索引查找/索引扫描/索引更新次数
sys.dm_db_index_physical_stats
用于统计索引的物理信息,最主要是检查索引碎片
sys.dm_db_index_operational_stats
统计索引操作统计信息,例如叶级页插入/删除/更新次数,加锁与等待累计时间
- 索引缺失:SQL SERVER在执行查询中会记录没有使用最佳索引的查询信息,通常用来分析并生成最佳索引
sys.dm_db_missing_index_group_stats
返回有关缺失索引组的摘要信息,例如,通过实现特定的缺失索引组所获取的性能改善。 sys.dm_db_missing_index_groups
返回有关特定缺失索引组的信息,例如组标识符和该组包含的所有缺失索引的标识符。 sys.dm_db_missing_index_details
返回有关缺失索引的详细信息,例如,返回缺失索引的表的名称和标识符,以及应组成缺失索引的列和列类型。 sys.dm_db_missing_index_columns (Transact-SQL)
返回有关缺失索引的数据库表列的信息。
SQL Server 索引基本概念与优化的更多相关文章
- SQL Server 索引知识-概念
概念篇 索引概念(index concept) 一种表或视图中相关的B-tree的数据结构.索引键列由一列或多列组成.可拥有包含性列(sql2005).用于提升Sql Server 查找相关数据行效率 ...
- Sql Server CPU 性能排查及优化的相关 Sql
Sql Server CPU 性能排查及优化的相关 Sql 语句,非常好的SQL语句,记录于此: --Begin Cpu 分析优化的相关 Sql --使用DMV来分析SQL Server启动以来累计使 ...
- 【译】索引进阶(一):SQL SERVER索引介绍
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/7 ...
- [转帖]SQL Server 索引中include的魅力(具有包含性列的索引)
SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 上个 ...
- SQL Server 索引中include
SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 开文 ...
- sql server 索引总结三
一.非聚集索引维护 非聚集索引的行定位器值保持相同的聚集索引值,即使该聚集索引列物理上重新定位后,也是如此. 为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割之后指向 ...
- SQL Server索引总结二
从CREATE开始 通过显式的CREATE INDEX命令 在创建约束时作为隐含的对象 随约束创建的隐含索引 当向表中添加如下两种约束之一时,就会创建隐含索引. 主键约束(聚集索引) 唯一约束(唯一索 ...
- sql server 索引总结一
一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...
- 转: SQL Server索引的维护 - 索引碎片、填充因子
转:http://www.cnblogs.com/kissdodog/archive/2013/06/14/3135412.html 实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题 ...
随机推荐
- 配置python学习环境遇到的问题:[Decode error - output not utf-8]
因为前阵子学习monkeyrunner的时候,碰到了很多关于.py的脚本,其实我是一知半解的,也没打算去学习一下.将就着看看吧,后来无意中看到自动化测试工程师都要求会脚本语言的时候,刺激了我,想了想, ...
- Java中Generics的使用
1.Java的Generics与C++的Template由于Java的Generics设计在C++的Template之后,因此Java的Generics设计吸取Template的很多经验和教训.首先, ...
- Maven项目的拆分与聚合
---------------------siwuxie095 Maven 项目的拆分与聚合 1.对已有的 Ma ...
- python数据类型内部结构解剖
一.前言 我们知道,python是一种动态语言,可以将任何类型的数据赋给任何变量,譬如: # Python代码 x = 4 x = "four" 这里已经将 x 变量的内容由整型转 ...
- Java SE-基本数据类型对应包装类
包装类 Java是面向对象的编程语言,包装类的出现更好的体现这一思想. 其次,包装类作为类是有属性有方法的,功能比基本数据类型要强大. [八种基本数据类型的包装类] byte ——Byte short ...
- dede 复制文章,远程图片无法本地化
解决方法: 1.找到dede的后台目录,在后台目录下的inc下找到inc_archives_functions.php 2.搜索GetCurContent函数,找到如下这段代码: preg_match ...
- cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'.
笔者最近学习一些spring mvc,在复制别人代码的时候报这个错.报错来源web.xml,原因是不符合xsd对xml的约束 源文件 <?xml version="1.0" ...
- vue1.0学习
vue 一片html代码配合上json,在new出来vue实例 Demo:1 数据双向绑定(v-model="message",{{message}}) <div id=&q ...
- PAT 1048 数字加密(20)(代码+思路)
1048 数字加密(20)(20 分) 本题要求实现一种数字加密方法.首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取 ...
- [django] Deploy Django Applications Using uWSGI and Nginx on Ubuntu 14.04
关键点1:chmod-socket=666 (mysite_uwsgi.ini) 关键点2 : 工程目录和虚拟环境目录搞清楚 几个参考: http://uwsgi-docs.readthedocs.i ...