SQL Server页类型汇总+疑问汇总

所属分类: 数据库 / MsSql 阅读数: 1383
收藏 0 赞 0 分享

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(*) cntFROM 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中使用ISNULL执行空值判断查询

这篇文章主要介绍了在SQL Server中使用ISNULL执行空值判断查询,ISNULL的好处是可以直接写在SELECT查询语句中,需要的朋友可以参考下
收藏 0 赞 0 分享

揭秘SQL Server 2014有哪些新特性(1)-内存数据库

微软SQL Server 2014提供了众多激动人心的新功能,但其中最让人期待的特性之一就是代号为” Hekaton”的内存数据库了,内存数据库特性并不是SQL Server的替代,而是适应时代的补充,现在SQL Server具备了将数据表完整存入内存的功能。那么今天我们就先来看
收藏 0 赞 0 分享

揭秘SQL Server 2014有哪些新特性(2)-固态硬盘 Buffer Pool(缓冲池) 扩展

SQL Server 2014 中引入的缓冲池扩展提供数据库引擎缓冲池的非易失性随机存取内存(即固态硬盘)扩展的无缝集成,从而显著提高 I/O 吞吐量。 那么今天我们来探究下,这个功能到底如何强悍吧
收藏 0 赞 0 分享

揭秘SQL Server 2014有哪些新特性(3)-可更新列存储聚集索引

可更新的列存储索引作为SQL Server 2014的一个关键功能之一,在提升数据库的查询性能方面贡献非常突出。据微软统计,在面向OLAP查询统计类系统中,相比其他SQL传统版本的数据库,报表查询的性能最大可提升上十倍。
收藏 0 赞 0 分享

揭秘SQL Server 2014有哪些新特性(4)-原生备份加密

SQL Server原声备份加密对数据安全提供了非常好的解决方案。使用原生备份加密基本不会增加备份文件大小,并且打破了使用透明数据加密后几乎没有压缩率的窘境。
收藏 0 赞 0 分享

解决SqlServer 各版本 sa帐户不能登录问题

我们在使用SqlServer的时候,经常会遇到sa账号不能登录的问题,那么我们怎么来处理这个问题呢,分享下个人的思路及方法
收藏 0 赞 0 分享

浅析SQL Server中包含事务的存储过程

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行。那么在存储过程里添加事务,则可以保证该事务里的所有sql代码要么完全执行要么完全不执行。
收藏 0 赞 0 分享

深入分析MSSQL数据库中事务隔离级别和锁机制

事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误。设置事务隔离级别将影响整条连接。
收藏 0 赞 0 分享

SQL优化技巧指南

这篇文章主要介绍了SQL优化的方方面面的技巧,以及应注意的地方,需要的朋友可以参考下
收藏 0 赞 0 分享

人工智能自动sql优化工具--SQLTuning for SQL Server

SQL语句是对数据库进行操作的惟一途径,对数据库系统的性能起着决定性的作用。对于同一条件下的SQL语句写法有很多,其中一些写法往往对性能又有很大影响。但是每个人掌握SQL语言的水平不同,如何才能保证写出高性能的SQL呢?
收藏 0 赞 0 分享
查看更多