SQL Server 存储(8/8):理解数据文件结构
这段时间谈了很多页,现在我们可以看下这些页在数据文件里是如何组织的。
我们都已经知道,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):理解数据文件结构的更多相关文章
- SQL Server 存储(1/8):理解数据页结构
我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...
- SQL Server 存储(2/8):理解数据记录结构
在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下. 数据记录存储我们具体的数据,换句话说,它存在 ...
- SQL SERVER存储引擎——04.数据
4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...
- 腾讯云图片鉴黄集成到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 ...
- SQL Server存储ntext截断问题
SQL Server存储ntext截断问题 最近遇到一个问题:将大文本存储到数据库的时候,查询出来的文本却被截断了. 最后百度发现,作者提出 sql server management studi ...
- SQL Server关于AlwaysOn的理解
(一)SQL Server-AlwaysOn 技术:SQL Server AlwaysOn 即“全面的高可用性和灾难恢复解决方案” 1.数据库级可用性-只读副本:SQL Server 2012-4个, ...
- 清空SQL Server数据库中所有表数据的方法(转)
清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...
- SQL Server跨库复制表数据错误的解决办法
SQL Server跨库复制表数据的解决办法 跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...
- 快速查看SQL Server 中各表的数据量以及占用空间大小
快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(1 ...
- 清空SQL Server数据库中所有表数据的方法
原文:清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...
随机推荐
- Spring MVC+Quartz 定时任务持久化
请自行参考: http://sloanseaman.com/wordpress/2011/06/06/spring-and-quartz-and-persistence/ https://object ...
- MySQL实现定时任务
如果要每30秒执行以下语句 '; 可以给MySQL建个定时任务,具体如下: delimiter // /* 设定语句终结符为 //,因存储过程语句用;结束 */ 一.查看event是否开启 show ...
- 深入分析Java Web技术(1)
BS网络模型的基本过程: 当我们在浏览器中输入"www.google.com"的时候,首先会请求DNS服务器对域名进行解析成都应的IP地址,然后根据这个IP地址在互联网上找到谷歌的 ...
- 文档大师 搜狗拼音无法输入汉字_乱码的解决方法_VB6程序
文档大师用 搜狗拼音无法输入汉字,显示的内容和输入的内容不一致.解决方法: 把中文输入里面的那个“美式键盘”再删掉就好用了,只保留搜狗输入法即可!
- 每日英语:What To Expect To Wear When You're Expecting
AT THE ACADEMY AWARDS earlier this month, Kerry Washington, the star of the ABC-TV series 'Scandal,' ...
- Android Multiple Screens Android 屏幕适配的一些总结
作为一名Android应用开发程序猿,最痛苦的事莫过于在屏幕适配了,这与历史原因有关,具体就不深究了. 直到最近才搞明白dpi是怎么换算的,在开发的过程中,一个应用运行的屏幕标准应该是分辨率为320x ...
- ECShop在任何页面调用最新文章并变成随机文章
一.让最新文章变成随机文章 在根目录 打开index.php文件 查找代码 ' ORDER BY a.article_type DESC, a.add_time DESC LIMIT ' . $GLO ...
- [JS Compose] 0. Understand 'Box' or 'Container', they are just like Array!
We'll examine how to unnest function calls, capture assignment, and create a linear data flow with a ...
- Django模块学习- django-pagination
实在是很简单的一个Django 的分页插件. 使用pip instal pagination 即可完成安装. 完成后配置如下: 1. 将安装文件中的 pagination 文件夹拷贝到项目的根目录下 ...
- 【AI】蒙特卡洛搜索树
http://jeffbradberry.com/posts/2015/09/intro-to-monte-carlo-tree-search/ 蒙特卡洛方法与随机优化: http://iacs-co ...