这段时间谈了很多页,现在我们可以看下这些页在数据文件里是如何组织的。

我们都已经知道,SQL Server把数据文件分成8k的页,页是IO的最小操作单位。SQL Server把数据文件里的第1页标记为0。在所有数据库文件里,前面的9个页面(到页号8)都是如下显示一样的顺序,第10个页(页号9)是启动页,用来保存数据库的元数据信息。

第1个页,页号0,是文件头(page type 15)。它保存着文件头信息。每个数据文件只有一个文件头页,而且是第0页的位置。文件头页里保存着数据文件信息,例如文件大小,最小大小,最大大小和文件增长方式等。

第2个页,页号1,是第一个PFS页(page type 11)。PFS页在数据文件里是第2个页(页号1),紧跟在文件头后(页号0)。GAM和SGAM用来跟踪区分配状态,PFS页用来跟踪页分配级别。当分配页面的时候,数据库引擎使用GAM和SGAM来识别有空页的区。一旦数据库引擎找到有空页的区,它使用PFS页来识别区里空页的可用空间量。可用空间只在保存LOB值(ie text/image, varchar(max),nvarchar(max),varbinary(max) ,row overflow data)或堆表页时跟踪。默认情况下,LOB数据保存在一个独立的页,在原页保存一个指向独立页的指针。这些就是数据能够保存的空页。对于索引页,因为数据的保存顺序和索引顺序是一致的,因此没有必用使用到PFS页。PFS页每8088个页重复一个。这就是说第1页,第8088页,第16176页,第24264页……在每个数据文件里都是PFS页。SQL Server: 理解PFS页

第3个页,页号2,是第一个GAM页(page type 8)。GAM页用来跟踪哪些区被使用。每个区对应GAM页的一个位。如果这个位的值是1,对应区是空、可用的,如果这个位的值是0,对应区是作为统一区或混合区使用。一个GAM页可以保存接近64000个区的信息。那就是说,一个GAM页可以保存(64000 * 8 * 8)/1024 = 4000 MB的信息。简而言之,一个7GB大小的数据文件将有2个GAM页。SQL Server : 理解GAM与SGAM页。

第4个页,页号3,是第一个SGAM页(page type 9)。SGAM页用来跟踪哪些区正作为混合区使用且至少有一个可用页。每个区对应一个GAM页的有一个位。如果这个位的值是1,对应区作为混合区使用且至少有个可用页,如果这个位值是0,对应区没作为混合区使用或所有页作为混合区使用了。一个SGAM页可以保存接近64000个区的信息。那就是说,一个SGAM页可以保存64000 * 8 * 8  /1024 =4000MB。简而言之,一个7GB大小的数据文件将有2个SGAM页。SQL Server : 理解GAM与SGAM页。

第5个、6个页,(页号4,5),在SQL Server架构里当前没有被使用。页类型是0。如果用DBCC PAGE命令查看这些页只会输出页头信息,并以非法页类型结束。

第7个页,页号6,是第一个DCM页(page type 16)。SQL Server使用DCM页来跟踪自上次完整备份后,修改过的区信息。每个区对应DCM页里的一个位。如果这个位的值1,对应区自上一次完整备份后,已被修改。如果这个位值是0,对应区自上一次完整备份后,未作修改。一个DCM页可以保存接近64000个区的信息。每511232个页,DCM页会重复一个。一个DCM页可以跟踪63904个区信息。第2个DCM页出现在第511238页。SQL Server: 理解DCM页。

第8个页,页号7,是第一个BCM页(page type 17)。SQL Server使用BCM页来跟踪自上次日志备份后,通过大容量日志操作被修改的区信息。每个区对应BCM页里一个位。如果这个位的值是1,对应区自上一次日志备份后,因大容量日志操作后,这个区被修改。如果这个位的值是0,对应区自上一次日志备份后,因大容量日志操作后,这个区未被修改。一个BCM页可以保存近64000个区的信息。每511232个页,BCM页会重复一个。一个BCM页可以跟踪63904个区信息。第2个BCM页出现在第511239页。SQL Server :理解BCM页。

第9个页,页号8,是第一个IAM页(page type 10)。IAM页是用来跟踪,指定表的分配单元的对应页或区在GAM内的分区里的分配情况。SQL Server :理解IAM页。

第10个页,页号9,是启动页(page type 13)。启动页只出现在主数据文件(prmary data file)里的第9页,启动页不会出现在第2个数据文件里。我们可以使用DBCC PAGE命令查看它的页信息,在这个页里保存的页信息值是自说明的。如果这个页因某些原因损坏的话,我们将不能使用命令DBCC CheckDb来修复。页还原也不能改变这个情况。只能从上一次好的数据库备份中恢复才可以修复这个问题。

从第11页开始,你可以看到各种不同的页混合在一起,像数据页,索引页,IAM页,行溢出页和LOB页等等。数据页的页类型是1,索引页的页类型是2,行溢出(Row-overflow)页和LOB页的页类型是3。数据页和索引页是以同样结构保存的。SQL Server:理解数据页结构。

行溢出(Row-overflow)页用来存储不能在一页里保存的数据。LOB页用来保存大型对象,并不作为行数据的一部分来保存。

参考文章:

http://www.sqlservercentral.com/blogs/practicalsqldba/2013/09/02/sql-server-data-file-structure/

SQL Server 存储(8/8):理解数据文件结构的更多相关文章

  1. SQL Server 存储(1/8):理解数据页结构

    我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...

  2. SQL Server 存储(2/8):理解数据记录结构

    在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下. 数据记录存储我们具体的数据,换句话说,它存在 ...

  3. SQL SERVER存储引擎——04.数据

    4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...

  4. 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期

    腾讯云图片鉴黄集成到C#   官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...

  5. SQL Server存储ntext截断问题

    SQL Server存储ntext截断问题   最近遇到一个问题:将大文本存储到数据库的时候,查询出来的文本却被截断了. 最后百度发现,作者提出 sql server management studi ...

  6. SQL Server关于AlwaysOn的理解

    (一)SQL Server-AlwaysOn 技术:SQL Server AlwaysOn 即“全面的高可用性和灾难恢复解决方案” 1.数据库级可用性-只读副本:SQL Server 2012-4个, ...

  7. 清空SQL Server数据库中所有表数据的方法(转)

    清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...

  8. SQL Server跨库复制表数据错误的解决办法

    SQL Server跨库复制表数据的解决办法   跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...

  9. 快速查看SQL Server 中各表的数据量以及占用空间大小

    快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(1 ...

  10. 清空SQL Server数据库中所有表数据的方法

    原文:清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...

随机推荐

  1. [转] 配置Log4j

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  2. MinStack

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  3. web项目总结

    web项目 Webroot下面的index.jsp页面的内容: <%@ page language="java" pageEncoding="UTF-8" ...

  4. awk语法

    awk是一个非常棒的数字处理工具.相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理.运行效率高,而且代码简单,对格式化的文本处理能力超强.先来一个例子: 文件a,统计 ...

  5. 画六边形-mat

    %% theta = linspace(0,2*pi,7); D=2; %边长 X=1; %中心横坐标 Y=2; %中心纵坐标 plot(D*cos(theta)+X,D*sin(theta) + Y ...

  6. SQL SERVER2012中使用游标来备份数据库

    在SQL SERVER中,添加JOB,可以使用以下语句设置定期备份数据库. DECLARE @name VARCHAR(50)--databasename DECLARE @path VARCHAR( ...

  7. Generating a new ASP.NET session in the current HTTPContext

    void regenerateId() { System.Web.SessionState.SessionIDManager manager = new System.Web.SessionState ...

  8. PowerShell实现文件下载(类wget)

    对Linux熟悉的读者可能会对Linux通过wget下载文件有印象,这个工具功能很强大,在.NET环境下提到下载文件大多数人熟悉的是通过System.Net.WebClient进行下载,这个程序集能实 ...

  9. 关于"The dependency was added by the project system and cannot be removed" Error

    阅读一个简单地工程代码,其中一个工程BaseCode是 static lib,另一个工程RunBaseCode使用该lib,但在工程设置的“Linker\Input\AdditionalDepende ...

  10. Oracle数据库管理员面试题

    Oracle数据库管理员面试题 1.模拟使用oracle的flashback找回过去某个时间点的数据,实现误操作的恢复. http://www.txw100.com/soft/2013/08/547. ...