SQL Server页类型汇总+疑问
该文章整理自:http://www.sqlnotes.info/2011/10/31/page-type/
SQL Server中包含多种不同类型的页,来满足数据存储的需求。不管是什么类型的页,它们的存储结构都是相同的。每个数据文件都包含相当数量的由8KB组成的页,即每页有8192bytes可用,每页都有96byte用于页头的存储,剩下的空间
才用来存储实际的数据,在页的最后是数据行偏移数组,也可以叫“页槽”数组,我们可以把一个页看做是有一个个方格的书橱,哪行数据占用了哪个槽,都在页尾的位置进行标示,并且页尾数组的写入顺序是倒叙的,这样就可以有效的利用页空间。
由此可以预见,页面上的“槽”并不一定是有序存放的,当有新的ID进来,并且该ID位于该页的最大ID和最小ID之间时(假设是以ID进行排序的叶子页),那么该ID数据行则直接插入到已经存在的数据行的后面即可,当有查询需要检索该ID所在的行时,
数据库引擎从索引页找到该“叶子”页,将该页全部加载到内存中,通过页尾的行偏移数组找到对应的行。页尾数组的记录大小存储在页头里,数组里面每一个关于“页槽”的记录占用空间为2bytes。

据我所知,SQL Server数据文件共有14种页类型:
类型1——数据页(Data Page):
- 堆中的数据页
- 聚集索引中的“叶子”页
- 在数据文件中的位置是随机的
- DBCC PAGE 中m_type=1
类型2——索引页(Index Page):
- 非聚集索引
- 非“叶子”级聚集索引
- 在数据文件中的位置是随机的
- DBCC PAGE 中m_type=2
类型3——文本混合页(Text Mixed Page):
- 较短长度的LOB数据类型,多种类型,多行存储
- 在数据文件中的位置是随机的
- DBCC PAGE 中m_type=3
类型4——文本页(Text Tree Page):
- 存储单个LOB行
- 在数据文件中的位置是随机的
- DBCC PAGE 中m_type=4
类型5——排序页(Sort Page):
- 进行排序操作时的临时页
- 常见于TempDB中,在用户数据中进行“ONLINE"操作时也可见(例如:联机创建索引未指定SORT_IN_TEMPDB选项时)
- 在数据文件中的位置是随机的
- DBCC PAGE 中m_type=19
类型6——全局分配映射页(GAM Page):
- Global Allocation Map,记录已分配的非共享(混合)区是否已被使用
- 每个区占用一个bit位,如果该值为1,说明该区可以使用,0则说明已被使用(但是并不一定存储空间已满)
- 第一个GAM页总是存储在每个数据文件PageID为2的页上
- DBCC PAGE 中m_type=8
类型7——共享全局分配映射页(SGAM Page):
- Shared Global Allocation Map,记录每一个共享(混合)区是否已被使用
- 每个区占用一个bit位,如果该值为1,说明该区有空闲的存储空间,0则说明区已满
- 第一个SGAM页总是存储在每个数据文件PageID为3的页上
- DBCC PAGE 中m_type=9
类型8——索引分配映射页(IAM Page):
- Index Allocation Map,记录GAM页之间堆表或者索引的区分配
- 在数据文件中的位置是随机的
- DBCC PAGE 中m_type=10
类型9——空闲空间跟踪页(PFS Page):
- Page Free Space,跟踪页的可用空间。
- 第一个PFS页总是存储在每个数据文件PageID为1的页上
- DBCC PAGE 中m_type=11
类型10——启动页(Boot Page):
- 存储所在数据库范围的信息
- 仅在每个数据库文件(file)ID为1的PageID为9的页上
- DBCC PAGE 中m_type=13
类型11——服务配置页(Server Configuration Page):
- 存储了sys.configurations中返回结果中的部分信息
- 该页仅存在于master数据库的文件ID为1PageID为10的页上
类型12——文件头页(File Header Page):
- 所在文件的信息
- 总是存在于每个文件PageID为0的页上
- DBCC PAGE 中m_type=15
类型13——差异更改映射(Differential Changed map):
- 记录GAM之间的每次全备或差异备份之后更改过的页面
- 第一个DCM页面在每个数据文件PageID为6的页上
- DBCC PAGE 中m_type=16
类型14——大容量更改映射(Bulk Change Map):
- 记录每个GAM之间上次备份之后大容量操作的更改
- 第一个BCM页面在每个数据文件PageID为7的页上
- DBCC PAGE 中m_type=17
如下SQL可以查询到你当前的数据库中的缓存的页类型及数量:
SELECT CASE page_type
WHEN 'DIFF_MAP_PAGE' THEN '差异更改映射(Differential Changed map)'
WHEN 'TEXT_MIX_PAGE' THEN '文本混合页(Text Mixed Page)'
WHEN 'ML_MAP_PAGE' THEN '这个字面意思应该是Minimally-Logged,最小化日志记录'
WHEN 'INDEX_PAGE' THEN '索引页(Index Page)'
WHEN 'FILEHEADER_PAGE' THEN '文件头页(File Header Page)'
WHEN 'DATA_PAGE' THEN '数据页(Data Page)'
WHEN 'IAM_PAGE' THEN '索引分配映射页(IAM Page)'
WHEN 'GAM_PAGE' THEN '全局分配映射页(GAM Page)'
WHEN 'BULK_OPERATION_PAGE' THEN '这个字面意思应该是大容量更改记录'
WHEN 'TEXT_TREE_PAGE' THEN '文本页(Text Tree Page)'
WHEN 'SGAM_PAGE' THEN '共享全局分配映射页(SGAM Page)'
WHEN 'PFS_PAGE' THEN '空闲空间跟踪页(PFS Page)'
WHEN 'BOOT_PAGE' THEN '启动页(Boot Page)'
ELSE '排序页?'
END ,
page_type ,
COUNT(*) cnt
FROM sys.dm_os_buffer_descriptors WITH ( NOLOCK )
WHERE database_id = DB_ID()
GROUP BY page_type
结果如下图所示:

按上面的数据类型介绍,我们很自然地认为类型14——大容量更改映射(Bulk Change Map)就是图示查询结果中第10行BULK_OPERATION_PAGE
但是事实是吗?我们将data_type=BULK_OPERATION_PAGE的记录查出来:
SELECT TOP 10 *
FROM sys.dm_os_buffer_descriptors
WHERE page_type='BULK_OPERATION_PAGE' AND DB_ID()=database_id
ORDER BY database_id,FILE_ID,page_id
查询结果:

我们把查询结果中的一个PageID带入DBCC PAGE(其实这里已经看出,这个pageID并不像上面说的第一个BCM页面在每个数据文件PageID为7的页上,它们是逻辑上连续的页!

我们发现上面的m_type=20!
我搜遍了google也没有找到m_type=20是什么记录!
参考网址:http://www.sqlskills.com/BLOGS/PAUL/post/Inside-the-Storage-Engine-Anatomy-of-a-page.aspx
但是我们可以查到如下信息:

m_type=17的这个数据类型ML map page,是在“大容量日志”模式下,记录自上次备份以来哪些区被更改过,该页第一个位置总是在每个文件的第7页上,我们折回上面第一个查询时的第三行,即PageType是ML_MAP_PAGE的那行,
并将其带入如下SQL查询出pageID的记录:

发现这才是传说中的那个第一页总是出现在每个文件第7页的混蛋!
我们将PageID7带入DBCC PAGE:

Oh,SHIT!这个的m_type是17!
好吧,我只能说,是我曲解了人家字面的意思,原来:
BCM ,大容量更改映射(Bulk Change Map),在数据库缓存中对应的PageType竟然是ML_MAP_PAGE!Minimally-Logged Page!
而那个该死的BULK_OPERATION_PAGE(m_type=20)是什么东西,谁能告诉我?
另外那个UNLINKED_REORG_PAGE,应该就是排序页吧?
SQL Server页类型汇总+疑问的更多相关文章
- 人人都是 DBA(VIII)SQL Server 页存储结构
当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看 ...
- SQL Server 127个SQL server热门资料汇总
SQL Server 127个SQL server热门资料汇总 最近有许多关于如何学习SQLSERVER的问题,其实新手入门的资源和贴子很多,现在向大家隆重推荐经过精心整理的[SQLSer ...
- SQL Server锁类型
SQL Server锁类型(SQL)收藏 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生 ...
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
- SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理
原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...
- MS SQL server对象类型type
执行下面代码,将获取ms sql server对象类型以及其说明 IF OBJECT_ID('tempdb.dbo.#type') IS NOT NULL DROP TABLE #type CREAT ...
- SQL Server时间类型datetime
SQL Server时间类型datetime 兼容ADO的COleDateTime. SQL datetime 日期和时间数据,可表示1753.1.1 至 9999.12.31的时间,精度为1/300 ...
- SQL Server 方言类型映射问题
关于SQL Server的类型映射问题,例如,nvarchar无法进行hibernate类型映射,需要通过convert进行类型转换方可进行获取
- SQL Server性能计数器收集汇总方案(Reporting Service)
通过收集计数器信息,并将计数器信息汇总为不同粒度存储,以Reporting Service报表服务器显示.以下是计数器收集汇总的基本架构. 笔者需要收集的SQL Server计数器包括:SQL Ser ...
随机推荐
- 一个免费的、跨平台的、开源音频编辑器Audacity
Audacity 是一个免费的开源程序,用于编辑音频录制.它可在多个平台(windows/linux)上运行.Audacity 基于 GUI,是一个具有多种选项的强大程序.它支持您录制各种类型的声音. ...
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- virtualbox linux虚拟机相关
linux虚拟机设置为静态IP 在virtualbox中安装好linux虚拟机后,如果采用的是NAT方式的话,linux虚拟机默认采用dhcp方式自动上网,而且用的是NetworkManager服务而 ...
- [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office
打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...
- C++标准库实现WAV文件读写
在上一篇文章RIFF和WAVE音频文件格式中对WAV的文件格式做了介绍,本文将使用标准C++库实现对数据为PCM格式的WAV文件的读写操作,只使用标准C++库函数,不依赖于其他的库. WAV文件结构 ...
- [原] KVM 虚拟化原理探究(4)— 内存虚拟化
KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...
- 代码的坏味道(20)——过度耦合的消息链(Message Chains)
坏味道--过度耦合的消息链(Message Chains) 特征 消息链的形式类似于:obj.getA().getB().getC(). 问题原因 如果你看到用户向一个对象请求另一个对象,然后再向后者 ...
- cesium自定义气泡窗口infoWindow
一.自定义气泡窗口与cesium默认窗口效果对比: 1.cesium点击弹出气泡窗口显示的位置固定在地图的右上角,默认效果: 2.对于习惯arcgis或者openlayer气泡窗口样式的giser来说 ...
- 【干货分享】流程DEMO-外出申请
流程名: 外出申请 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: 流程: 图片:2.png DEMO包下载: http://files.cnblog ...
- php利用root权限执行shell脚本
vi /etc/sudoers , 为apache用户赋予root权限,并且不需要密码,还有一步重要的修改(我被困扰的就是这个地方) root ALL=(ALL) ALL apache ALL= ...