数据页和区

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. 导出 java.io.IOException: 权限不够

    项目原先都是开发使用root账号登陆服务器,人肉部署. 今天改成了自动部署,部署之后发现导出用不了了,查看服务器日志提示: 查看项目启动用户是app,推断是app用户的权限不够,导致导出无法在服务器创 ...

  2. 部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930;

    描述:部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930: 原因:所有物料规划PR时对舍入值的先后考虑逻辑影响到回写出来的temp ...

  3. Codeforces Round #533 (Div. 2)

    C: 题意: 有n个整数ai,数列a有两个神奇的性质.1.所有的整数都在[l,r]范围内.2.这n个数的和能被3整除.现在给出l和r,和个数n,问你有多少种方法构造出数列a,方案数mod1e9+7. ...

  4. TZOJ 5280 搜索引擎(模拟字符串)

    描述 谷歌.百度等搜索引擎已经成为了互连网中不可或缺的一部分.在本题中,你的任务也是设计一个搜索论文的搜索引擎,当然,本题的要求比起实际的需求要少了许多. 本题的输入将首先给出一系列的论文,对于每篇论 ...

  5. mysql数据库的最基本的命令

    #查看mysql有哪些数据库:show databases; 创建一个数据库名称为DataBaseName,字符编码为utf8支持中文create database DataBaseName char ...

  6. iOS 代码调试

    僵尸对象导致crash(Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)),需要给位release模式,debug模式不打印内存地址 https://blog. ...

  7. js variable 变量

    局部作用域 由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的: 'use strict'; function foo() { for ( ...

  8. macos修改vmware Fusion的NAT网络

    https://blog.csdn.net/zhishengqianjun/article/details/77046796 http://pubs.vmware.com/fusion-5/index ...

  9. Django之virtualenv下安装xadmin

    1.安装xadmin,通过pip 进入virtualenv pip安装xadmin pyyuc:~ yuchao$ source PycharmProjects/mxvenv/bin/activate ...

  10. mysql thread_cache 和 thread_pool 之间的关系

    线程池是Mysql5.6的一个核心功能,对 于服务器应用而言,无论是web应用服务还是DB服务,高并发请求始终是一个绕不开的话题.当有大量请求并发访问时,一定伴随着资源的不断创建和释放,导 致资源利用 ...