欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-02 08:05:40
sql server中包含多种不同类型的页,来满足数据存储的需求。不管是什么类型的页,它们的存储结构都是相同的。每个数据文件都包含相当数量的由8kb组成的页,即每页有819...

sql server中包含多种不同类型的页,来满足数据存储的需求。不管是什么类型的页,它们的存储结构都是相同的。每个数据文件都包含相当数量的由8kb组成的页,即每页有8192bytes可用,每页都有96byte用于页头的存储,剩下的空间

才用来存储实际的数据,在页的最后是数据行偏移数组,也可以叫“页槽”数组,我们可以把一个页看做是有一个个方格的书橱,哪行数据占用了哪个槽,都在页尾的位置进行标示,并且页尾数组的写入顺序是倒叙的,这样就可以有效的利用页空间。

由此可以预见,页面上的“槽”并不一定是有序存放的,当有新的id进来,并且该id位于该页的最大id和最小id之间时(假设是以id进行排序的叶子页),那么该id数据行则直接插入到已经存在的数据行的后面即可,当有查询需要检索该id所在的行时,

数据库引擎从索引页找到该“叶子”页,将该页全部加载到内存中,通过页尾的行偏移数组找到对应的行。页尾数组的记录大小存储在页头里,数组里面每一个关于“页槽”的记录占用空间为2bytes。

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

据我所知,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

结果如下图所示:

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

按上面的数据类型介绍,我们很自然地认为类型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

查询结果:

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

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

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

我们发现上面的m_type=20

我搜遍了google也没有找到m_type=20是什么记录!

参考网址:http://www.sqlskills.com/blogs/paul/post/inside-the-storage-engine-anatomy-of-a-page.aspx

但是我们可以查到如下信息:

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

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

并将其带入如下sql查询出pageid的记录:

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

发现这才是传说中的那个第一页总是出现在每个文件第7页的混蛋!

我们将pageid7带入dbcc page:

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

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