Sql Server 索引以及页和区
索引(Index),相信大家都知道就是给表中的数据添加了一个目录,使我们可以快速检索到我们想要的数据,但这个目录是什么?SqlServer又是如何管理的?要搞明白这些,我们就要先了解sqlserver数据库中的页(Page),区(Extents)的概念,如有不对的地方,欢迎拍砖指正。
页(Page)
- 页是数据存储的最本单位,SqlServer读写也是以页为单位进行的,即页是对数据管理的最小单位。页的大小8192B=8KB, 1MB存储128个数据页。
- 一个页具体如下图所示(图片引用MSDN),包含3部分:
- 头信息Page Hearder,占用96byte,存储关于页的信息,页码,页类型等;
- 数据行DataRows,具体存储的内容,占用8060byte;
- 行偏移表Row Offset Table,记录每个数据行第一个字节和页首(即96byte)的距离,顺序和页中行的顺序相反,占36byte;

页的类型本文涉及到的主要如下,其它页类型可自行查询MSDN
- Data:当行中的文本设置为 ON 时,具有除 text、ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据以外的所有数据的数据行。
- Index:索引条目。
- Text/Image:大型对象数据类型:(text、ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据),数据行超过 8 KB 时为可变长度数据类型列:(varchar、nvarchar、varbinary 和 sql_variant)
看到上面的Index页类型,我们就明白了索引和数据行一样也是存储在页中的,而且SqlServer针对不同的数据类型划分了不同的页类型,大数据类型(text,image,varchar(max),nvarchar(max))是存储在Text/Image页类型中的,该类型中还会存储单个数据行超过8KB时的可变长类型,即一页中只有一行,且数据行所占空间大小大于8060(即8192-96-36)byte,实际表中所有列的和不能大于8053byte(两者为啥相差7byte可参考此链接),这种情况下sqlServer会从最大长度的可变长度列开始动态将一个或多个列移动到 ROW_OVERFLOW_DATA 分配单元中的页,并在原始页中维护一个指针,如果后续数据行变小,SqlServer会将列再移回来。
区(Extents)
区是磁盘上连续的8个页,8*8KB=64KB。
- 混合盘区 Mixed Extents:每个页可能对应不同对象;
- 统一盘区 Uniform Extents:一个区中的8个页对应一个对象
索引(Index)
通过上面我们已经知道,索引也是存储在页上的,具有聚集索引(Clustered Index)的表是以B-tree(不是B减树。。。)结构组织的且数据按聚集索引顺序存储,否则存储在堆(Heap)上。B树上每一页称为一个索引节点,其中包含:
- 根节点:顶端节点,包含存有索引行的索引页;
- 中间级:根和叶节点之间的,同根节点包含存有索引行的索引页;
叶节点:底层节点,包含基础表的数据页;
索引行:包含一个键值和一个指针,该指针指向B树上的某一中间级页或叶级索引中的某个数据行。每级索引中的页均被链接在双向链接列表中.
非聚集索引(Nonclustered Index):具有和聚集索引相同的B树,区别如下:
- 数据行不会按照非聚集键排序和存储;
叶级节点指向的不是数据页而是索引页;
索引行:包含非聚集键和行定位符,此定位符指向聚集索引或堆中包含该键值的数据行.
表组织结构图(图片引用MSDN),最底下一行是三种分配单元,详细可直接前往MSDN连接查看。

一些思考:
通过以上内容,我们可以更直观,更容易总结出:
- 应该尽量把索引设置在较窄的列上,这样一个页上就可以存储更多的索引行,检索的效率就高了;
- 经常变动的列上不宜设置索引,因为会导致数据行及索引页的一连串修改调整;
- 建立多个索引可以提供表的查询性能,但同时也增加了修改数据的复杂度;
- 索引应尽量覆盖查询,因为数据全部存储在索引中,从而减少了磁盘I/O
...
最近花了一些时间整理了一下页,区,索引的相关知识点,并看了一些博客,感觉之前很多不懂的地方都豁然开朗了,其实相关内容还有很多 ,这里只是介绍了一部分,另外我们还是要多看官方文档(MSDN建议看英文的,中文翻译的好多地方让你很迷惑,看英文版反而能看懂)和大牛们的博客。
参考链接
- MSDN : https://docs.microsoft.com/zh-cn/sql/relational-databases/pages-and-extents-architecture-guide
- http://www.cnblogs.com/woodytu/p/4486193.html
Sql Server 索引以及页和区的更多相关文章
- SQL Server索引进阶:第四级,页和区
原文地址: Stairway to SQL Server Indexes: Level 4, Pages and Extents 本文是SQL Server索引进阶系列(Stairway to SQL ...
- 转: SQL Server索引的维护 - 索引碎片、填充因子
转:http://www.cnblogs.com/kissdodog/archive/2013/06/14/3135412.html 实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题 ...
- SQL Server索引的维护 - 索引碎片、填充因子 <第三篇>
实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除工具是一样的,因为处理是相同的. 对于非常小的表(比64KB小得多), ...
- SQL Server 索引碎片产生原理重建索引和重新组织索引
数据库存储本身是无序的,建立了聚集索引,会按照聚集索引物理顺序存入硬盘.既键值的逻辑顺序决定了表中相应行的物理顺序 多数情况下,数据库读取频率远高于写入频率,索引的存在 为了读取速度牺牲写入速度 页 ...
- [笔记整理]SQL Server 索引碎片 和 重建索引
铺垫知识点: 数据库存储本身是无序的,建立了聚集索引,会按照聚集索引物理顺序存入硬盘.既键值的逻辑顺序决定了表中相应行的物理顺序 多数情况下,数据库读取频率远高于写入频率,索引的存在 为了读取速度牺牲 ...
- sql server 索引总结一
一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...
- T-SQL查询高级—SQL Server索引中的碎片和填充因子
写在前面:本篇文章需要你对索引和SQL中数据的存储方式有一定了解.标题中高级两个字仅仅是因为本篇文章需要我的T-SQL进阶系列文章的一些内容作为基础. 简介 在SQL Server中,存储数据 ...
- SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 <第一篇>
一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...
- SQL Server 索引结构及其使用(一)
转载:SQL Server 索引结构及其使用(一) 作者:freedk 一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clus ...
随机推荐
- window下如何使用Git上传代码到github远程服务器上(转)
注册账户以及创建仓库 首先你得有一个github账号,没有自行注册,登录成功后应该是这样 在页面上方用户菜单上选择 "+"->New repository 创建一个新的仓库 ...
- hi3531芯片的标识寄存器
芯片的标识寄存器 0xee0.0xee4.0xee8.0xeec(基址是0x2005_0000) 系统控制器提供了芯片标识(ID)寄存器SC_SYSID.这个标识寄存器是一个概念上 的32bit 的标 ...
- 利用ffmpeg将H264流 解码为RGB
利用H264解码分为几个步骤: 注意一点在添加头文件的时候要添加extern "C",不然会出现错误 [cpp] view plaincopy extern "C&quo ...
- Java中的大小写字母相互转换(不利用Java自带的方法)
Java中的大小写字母相互转换(不利用Java自带的方法) 1.设计源码 /** * * @title:UpperAndLower.java * @Package:com.you.utils * @D ...
- Caused by: java.lang.ClassNotFoundException: javax.persistence.NamedStoredProcedureQuery
1.错误描述 2014-7-12 21:06:37 org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreat ...
- /opt/apache-tomcat-7.0.57/conf/catalina.policy(权限不够)
1 错误描述 /opt/apache-tomcat-7.0.57/conf/catalina.policy(权限不够) 2 错误原因 3 解决办法
- 【原】Spring源码浅析系列-导入源码到Eclipse
用了Spring几年,平时也断断续续在项目里看过一些源码,大多都是比较模糊的,因为一旦从一个地方进去就找不到方向了,只能知道它大概是做了什么事能达到这个功能或者效果,至于细节一般没有太深入去研究.后来 ...
- Keras官方中文文档:序贯模型
快速开始序贯(Sequential)模型 序贯模型是多个网络层的线性堆叠,也就是"一条路走到黑". 可以通过向Sequential模型传递一个layer的list来构造该模型: f ...
- 洛谷P1501 [国家集训队]Tree II(LCT,Splay)
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...
- 【BZOJ2818】Gcd(莫比乌斯反演)
[BZOJ2818]Gcd(莫比乌斯反演) 题面 Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Ou ...