SQLServer页类型汇总+疑问汇总
SQLServer中包含多种不同类型的页,来满足数据存储的需求。不管是什么类型的页,它们的存储结构都是相同的。每个数据文件都包含相当数量的由8KB组成的页,即每页有8192bytes可用,每页都有96byte用于页头的存储,剩下的空间
才用来存储实际的数据,在页的最后是数据行偏移数组,也可以叫“页槽”数组,我们可以把一个页看做是有一个个方格的书橱,哪行数据占用了哪个槽,都在页尾的位置进行标示,并且页尾数组的写入顺序是倒叙的,这样就可以有效的利用页空间。
由此可以预见,页面上的“槽”并不一定是有序存放的,当有新的ID进来,并且该ID位于该页的最大ID和最小ID之间时(假设是以ID进行排序的叶子页),那么该ID数据行则直接插入到已经存在的数据行的后面即可,当有查询需要检索该ID所在的行时,
数据库引擎从索引页找到该“叶子”页,将该页全部加载到内存中,通过页尾的行偏移数组找到对应的行。页尾数组的记录大小存储在页头里,数组里面每一个关于“页槽”的记录占用空间为2bytes。
据我所知,SQLServer数据文件共有14种页类型:
类型1——数据页(DataPage):堆中的数据页聚集索引中的“叶子”页在数据文件中的位置是随机的DBCCPAGE中m_type=1类型2——索引页(IndexPage):
非聚集索引非“叶子”级聚集索引在数据文件中的位置是随机的DBCCPAGE中m_type=2类型3——文本混合页(TextMixedPage):
较短长度的LOB数据类型,多种类型,多行存储在数据文件中的位置是随机的DBCCPAGE中m_type=3类型4——文本页(TextTreePage):
存储单个LOB行在数据文件中的位置是随机的DBCCPAGE中m_type=4类型5——排序页(SortPage):
进行排序操作时的临时页常见于TempDB中,在用户数据中进行“ONLINE"操作时也可见(例如:联机创建索引未指定SORT_IN_TEMPDB选项时)在数据文件中的位置是随机的DBCCPAGE中m_type=19类型6——全局分配映射页(GAMPage):
GlobalAllocationMap,记录已分配的非共享(混合)区是否已被使用每个区占用一个bit位,如果该值为1,说明该区可以使用,0则说明已被使用(但是并不一定存储空间已满)第一个GAM页总是存储在每个数据文件PageID为2的页上DBCCPAGE中m_type=8类型7——共享全局分配映射页(SGAMPage):
SharedGlobalAllocationMap,记录每一个共享(混合)区是否已被使用每个区占用一个bit位,如果该值为1,说明该区有空闲的存储空间,0则说明区已满第一个SGAM页总是存储在每个数据文件PageID为3的页上DBCCPAGE中m_type=9类型8——索引分配映射页(IAMPage):
IndexAllocationMap,记录GAM页之间堆表或者索引的区分配在数据文件中的位置是随机的DBCCPAGE中m_type=10类型9——空闲空间跟踪页(PFSPage):
PageFreeSpace,跟踪页的可用空间。第一个PFS页总是存储在每个数据文件PageID为1的页上DBCCPAGE中m_type=11
类型10——启动页(BootPage):
存储所在数据库范围的信息仅在每个数据库文件(file)ID为1的PageID为9的页上DBCCPAGE中m_type=13类型11——服务配置页(ServerConfigurationPage):
存储了sys.configurations中返回结果中的部分信息该页仅存在于master数据库的文件ID为1PageID为10的页上类型12——文件头页(FileHeaderPage):
所在文件的信息总是存在于每个文件PageID为0的页上DBCCPAGE中m_type=15类型13——差异更改映射(DifferentialChangedmap):
记录GAM之间的每次全备或差异备份之后更改过的页面第一个DCM页面在每个数据文件PageID为6的页上DBCCPAGE中m_type=16类型14——大容量更改映射(BulkChangeMap):
记录每个GAM之间上次备份之后大容量操作的更改第一个BCM页面在每个数据文件PageID为7的页上DBCCPAGE中m_type=17如下SQL可以查询到你当前的数据库中的缓存的页类型及数量:
结果如下图所示:
按上面的数据类型介绍,我们很自然地认为类型14——大容量更改映射(BulkChangeMap)就是图示查询结果中第10行BULK_OPERATION_PAGE
但是事实是吗?我们将data_type=BULK_OPERATION_PAGE的记录查出来:
ORDERBYdatabase_id,FILE_ID,page_id
查询结果:
我们把查询结果中的一个PageID带入DBCCPAGE(其实这里已经看出,这个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的这个数据类型MLmappage,是在“大容量日志”模式下,记录自上次备份以来哪些区被更改过,该页第一个位置总是在每个文件的第7页上,我们折回上面第一个查询时的第三行,即PageType是ML_MAP_PAGE的那行,
并将其带入如下SQL查询出pageID的记录:
发现这才是传说中的那个第一页总是出现在每个文件第7页的混蛋!
我们将PageID7带入DBCCPAGE:
Oh,SHIT!这个的m_type是17!
好吧,我只能说,是我曲解了人家字面的意思,原来:
BCM,大容量更改映射(BulkChangeMap),在数据库缓存中对应的PageType竟然是ML_MAP_PAGE!Minimally-LoggedPage!
而那个该死的BULK_OPERATION_PAGE(m_type=20)是什么东西,谁能告诉我?
另外那个UNLINKED_REORG_PAGE,应该就是排序页吧?
相关文章
- 复制SQL Server 主从复制:实现数据安全可靠的分布式备份(sqlserver主从)
- SQL Server身份验证: 大数据时代的安全壁垒(SQLServer身份验证)
- 从零开始自学SQLServer,获取更多数据库知识(自学网sqlserver)
- 腾讯云SQL Server:极致体验,轻松云端运行(腾讯云sqlserver)
- 申请SQLServer:配置步骤及注意事项(申请sqlserver)
- SQLServer中如何正确复制数据库(复制 sqlserver)
- SQLServer数据库备份表的操作与管理(备份表sqlserver)
- 如何运用SQLserver镜像库获取数据副本(sqlserver镜像库)
- 解决sqlserver启动问题:快速找出问题根源(sqlserver启动)
- SQL Server 部署指南:快速搭建数据库环境(sqlserver 部署)
- 利用SQLServer追踪器深入了解数据库状态(sqlserver追踪器)
- 将SQLServer数据类型转换为整型(sqlserver转整型)
- SQLServer快速行查询实现数据库精准查询(sqlserver行查询)
- 更新SQLserver,提升性能(sqlserver行版本)
- 使用SQLServer实现多表联查的强大功能(sqlserver 联查)
- 如何在SQLServer中制作高效率的编辑技巧(sqlserver 编辑)
- :ssSQL Server:构建datacentric应用的动力源(sqlserver 简写)
- 探索SQL Server的视图功能(sqlserver的视图)
- 使用SQLServer模拟器提升学习效率(sqlserver模拟器)
- SQLServer:让数据安全从有道上的改变(sqlserver有道)
- Sqlserver日志空间满:解决之道(sqlserver日志满)
- 库构建SQLServer数据仓库:让数据发挥最大价值(sqlserver数据仓)
- 快速掌握SQL Server指令,提升效率(sqlserver 指令)
- SQLServer中嵌套循环的简便之道(sqlserver嵌套循环)
- 使用SQLServer记录姓名及号码的简单方法(sqlserver 姓号)
- 设置SQL Server双IP设置:实现安全可靠的网络环境(sqlserver双ip)
- 字段SQL Server中利用SUBSTRING截取字段(sqlserver中截取)
- SQL Server 操作入门指南(sqlserver操作)
- 使用SQLServer系统构建高效的数据库管理模式(sqlserver系统数据库)
- 借助SqlServer快速构建安全可靠的镜像库(镜像库sqlserver)
- sqlserver数据库主键的生成方式小结(sqlserver,mysql)