数据页和区

SQL Server 中的数据以“页”(Page)的形式保存数据,页是SQL Server 的IO单位,读/写一次至少是一页。一页为8K(8192byte).
页由三部分组成,页头,数据和偏移量。页头大小是96byte,记录页号,所属对象和页类型(IAM,DataPage,IndexPage),数据部分是8060byte,用来存放实际数据。偏移量36byte,也叫“slot”,用来标记每一行数据的位置

一个区=8个连续的页。

B树和索引键

B树(Balanced-Tree) 平衡多路查找树结构

  1. 含有一个跟节点(root node)
  2. 若干非页叶节点(none-leaf node)
  3. 最后一层为叶节点(leaf node),一个索引仅有一层(最后一层)叶子节点
  4. 根节点和非叶节点存放按顺序排列的键值(建索引的行)。对于聚集索引,叶子节点存放实际的数据行(所以只有一个聚集索引),而对于非聚集索引,叶子节点存放键值和书签(RID,记录文件号,页号和slot号)

索引碎片和填充因子

  • 分页:当发生插入或者更新操作时,如果数据页已经不够空间容纳新数据,就会发生分页,即新建一页来存放新数据。
    • 正向记录(forwarded records): 发生在堆表(即没有索引的表)中,在旧页中放一个指针指向新页,在新页中放置新数据和一个指向旧页的指针。
    • 页拆分(Page Split): 发生在索引(聚集索引和非聚集索引的数据页中),当插入或更新数据时,如果数据页已经没有空间放置新数据,就会新建一页,将旧页中一半的数据移动到新页中,同时在旧页中放置新数据,如果还不够空间,则继续拆分。
  • 索引碎片:当发生分页情况时,新页有可能和旧页不是连续的,例如隔开了N个页或者N个区,这样就形成了碎片。碎片增加了磁盘IO数量,原来读100条数据只需读10页,但有碎片情况下有可能需要读20页或更多(虽然一次IO最小是一个页,但一般一次都不止一个页)

(上图为Careyson的原创图片)

  • 如何减少分页
  1. 使用自增ID。自增ID具有连续性,插入的新数据页通常位于索引数据页尾部。而使用类似newid()产生的GUID因为字母具有随机性,容易在索引叶子页的中间段插入,导致页不连续而产生碎片。
  2. 重新生成或重新组织索引。重生生成索引会删除原来的索引并且重新建立新索引。重组索引会对叶子页进行物理排序,使其连续。
  3. 填充因子。 提供填充因子选项是为了优化索引数据存储和性能。当创建或重新生成索引时,填充因子的值可确定每个叶级页上要填充数据的空间百分比,以便在每一页上保留一些剩余空间作为以后扩展索引的可用空间。例如,指定填充因子的值为 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 索引基本概念与优化的更多相关文章

  1. SQL Server 索引知识-概念

    概念篇 索引概念(index concept) 一种表或视图中相关的B-tree的数据结构.索引键列由一列或多列组成.可拥有包含性列(sql2005).用于提升Sql Server 查找相关数据行效率 ...

  2. Sql Server CPU 性能排查及优化的相关 Sql

    Sql Server CPU 性能排查及优化的相关 Sql 语句,非常好的SQL语句,记录于此: --Begin Cpu 分析优化的相关 Sql --使用DMV来分析SQL Server启动以来累计使 ...

  3. 【译】索引进阶(一):SQL SERVER索引介绍

      [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正]  原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/7 ...

  4. [转帖]SQL Server 索引中include的魅力(具有包含性列的索引)

    SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 上个 ...

  5. SQL Server 索引中include

    SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 开文 ...

  6. sql server 索引总结三

    一.非聚集索引维护 非聚集索引的行定位器值保持相同的聚集索引值,即使该聚集索引列物理上重新定位后,也是如此. 为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割之后指向 ...

  7. SQL Server索引总结二

    从CREATE开始 通过显式的CREATE INDEX命令 在创建约束时作为隐含的对象 随约束创建的隐含索引 当向表中添加如下两种约束之一时,就会创建隐含索引. 主键约束(聚集索引) 唯一约束(唯一索 ...

  8. sql server 索引总结一

    一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...

  9. 转: SQL Server索引的维护 - 索引碎片、填充因子

    转:http://www.cnblogs.com/kissdodog/archive/2013/06/14/3135412.html 实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题 ...

随机推荐

  1. 配置python学习环境遇到的问题:[Decode error - output not utf-8]

    因为前阵子学习monkeyrunner的时候,碰到了很多关于.py的脚本,其实我是一知半解的,也没打算去学习一下.将就着看看吧,后来无意中看到自动化测试工程师都要求会脚本语言的时候,刺激了我,想了想, ...

  2. Java中Generics的使用

    1.Java的Generics与C++的Template由于Java的Generics设计在C++的Template之后,因此Java的Generics设计吸取Template的很多经验和教训.首先, ...

  3. Maven项目的拆分与聚合

    ---------------------siwuxie095                                     Maven 项目的拆分与聚合         1.对已有的 Ma ...

  4. python数据类型内部结构解剖

    一.前言 我们知道,python是一种动态语言,可以将任何类型的数据赋给任何变量,譬如: # Python代码 x = 4 x = "four" 这里已经将 x 变量的内容由整型转 ...

  5. Java SE-基本数据类型对应包装类

    包装类 Java是面向对象的编程语言,包装类的出现更好的体现这一思想. 其次,包装类作为类是有属性有方法的,功能比基本数据类型要强大. [八种基本数据类型的包装类] byte ——Byte short ...

  6. dede 复制文章,远程图片无法本地化

    解决方法: 1.找到dede的后台目录,在后台目录下的inc下找到inc_archives_functions.php 2.搜索GetCurContent函数,找到如下这段代码: preg_match ...

  7. 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" ...

  8. vue1.0学习

    vue 一片html代码配合上json,在new出来vue实例 Demo:1 数据双向绑定(v-model="message",{{message}}) <div id=&q ...

  9. PAT 1048 数字加密(20)(代码+思路)

    1048 数字加密(20)(20 分) 本题要求实现一种数字加密方法.首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取 ...

  10. [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 ...