SQL Server页类型汇总+疑问

原文: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_idORDER 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,应该就是排序页吧?

时间: 2024-10-02 02:18:29

SQL Server页类型汇总+疑问的相关文章

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

SQL Server中包含多种不同类型的页,来满足数据存储的需求.不管是什么类型的页,它们的存储结构都是相同的.每个数据文件都包含相当数量的由8KB组成的页,即每页有8192bytes可用,每页都有96byte用于页头的存储,剩下的空间 才用来存储实际的数据,在页的最后是数据行偏移数组,也可以叫"页槽"数组,我们可以把一个页看做是有一个个方格的书橱,哪行数据占用了哪个槽,都在页尾的位置进行标示,并且页尾数组的写入顺序是倒叙的,这样就可以有效的利用页空间. 由此可以预见,页面上的&quo

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

SQL Server中包含多种不同类型的页,来满足数据存储的需求.不管是什么类型的页,它们的存储结构都是相同的.每个数据文件都包含相当数量的由8KB组成的页,即每页有8192bytes可用,每页都有96byte用于页头的存储,剩下的空间 才用来存储实际的数据,在页的最后是数据行偏移数组,也可以叫"页槽"数组,我们可以把一个页看做是有一个个方格的书橱,哪行数据占用了哪个槽,都在页尾的位置进行标示,并且页尾数组的写入顺序是倒叙的,这样就可以有效的利用页空间. 由此可以预见,页面上的&quo

SQL Server页类型详解

SQL Server中包含多种不同类型的页,来满足数据存储的需求.不管是什么类型的页,它们的存储结构都是相同的.每个数据文件都包含相当数量的由8KB组成的页,即每页有8192bytes可用,每页都有96byte用于页头的存储,剩下的空间 才用来存储实际的数据,在页的最后是数据行偏移数组,也可以叫"页槽"数组,我们可以把一个页看做是有一个个方格的书橱,哪行数据占用了哪个槽,都在页尾的位置进行标示,并且页尾数组的写入顺序是倒叙的,这样就可以有效的利用页空间. 由此可以预见,页面上的&quo

人人都是 DBA(VIII)SQL Server 页存储结构

原文:人人都是 DBA(VIII)SQL Server 页存储结构 当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看新建的表的元数据信息. 下面使用创建 Customer 表的过程作为示例. USE [TEST] GO DROP TABLE [dbo].[Customer] GO CREATE TABLE [dbo].[Customer]( [I

SQL server警报类型详解

一个警报响应一种特定的事件. 警报响应下列事件类型: 1.SQL Server 事件: 可以指定一个警报响应一个或多个事件. 使用下列参数来指定触发警报的事件: 错误号 SQL Server 代理在发生特定错误时发出警报. 例如,可以指定错误号 2571 来响应未经授权就尝试调用数据库控制台命令 (DBCC) 的操作. 严重级别 SQL Server 代理在发生特定级别的严重错误时发出警报. 例如,可以指定严重级别 15 来响应 Transact-SQL 语句中的语法错误. 数据库 SQL Se

SQL Server报错汇总

  开个单章,记录遇到的SQL Server的问题及解决办法,方便自已以后回顾. 该文章会不断完善 1)SQL Server服务突然无法启动 问题描述:之前一直没有问题,突然某天无法启动了 解决办法:查看控制面板->管理工具->事件查看器,发现是因为登录失败而无法启动. 找到原因,就简单了,从服务中找到SQL Server的服务,右键属性,然后打开"登录"tab页,选上本地系统,就OK了. 该问题多半是因为更改了操作系统的登录密码造成了.所以要更新sqlserver的账户登

SQL Server 2008的汇总技巧

SQL Server 2008中对汇总有明显的增强,有点像Oracle的语法了.请看下面五个例子: 假定场景如下:某几位员工在不同时间参加了不同的项目,获取了相应的收入,现在需要按各种分类进行统计. 基本表如下: View Code USE testDb2GO IF NOT OBJECT_ID('tb_Income') IS NULLDROP TABLE [tb_Income] /****** Object: Table [dbo].[tb_Income] Script Date: 2012/4

N字符在Sql Server字段类型中的重要性概述

Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示 如果还为了这个纠结,就直接看看后面的解说,做决定吧. 一般如果用到中文或者其它特殊字符,我就会使用n开头的类型,否则的话直接使用var开头的. sql server中的varchar和Nvarchar有什么区别? 答: varchar(n) 长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的

Sql Server 字段类型说明

字段类型 描述  bit  0或1的整型数字  int  从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字  smallint  从-2^15(-32,768)到2^15(32,767)的整型数字  tinyint  从0到255的整型数字      decimal  从-10^38到10^38-1的定精度与有效位数的数字  numeric  decimal的同义词      money  从-2^63(-922,337,203,685,477.58