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数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...
随机推荐
- 美团在Redis上踩过的一些坑-目录(本人非美团)(转)
来自:http://carlosfu.iteye.com/blog/2254154 分为5个部分: 一.周期性出现connect timeout 二.redis bgrewriteaof问 ...
- “Adobe Flash Player因过期而遭到阻止”的解决办法
谷歌浏览器总是提示“Adobe Flash Player因过期而遭到阻止”,然后点进去,又更新不了,因为伟大的TC已经把谷歌屏蔽了. 解决办法就是到flash官网更新到最新的Flash https:/ ...
- WPF 触发器
属性触发器:数据触发器:事件触发器
- 如何使Session永不过期
转载:http://blog.csdn.net/wygyhm/article/details/2819128 先说明情况:公司做监控系统,B/S结构,主要用在局域网内部!监控系统开机可能要开好长时间, ...
- OGG-01232 Receive TCP params error: TCP/IP error 104 (Connection reset by peer), endpoint:
源端: 2015-02-05 17:45:49 INFO OGG-01815 Virtual Memory Facilities for: COM anon alloc: mmap(MAP_ANON) ...
- myeclipse9或myeclipse10安装svn的方法
下载最新的SVN包 site-1.6.5.zip 从中解压出features与plugins文件夹,复制到C:\toBeInstalledSVN 里面,其它的*.xml文件不要 复制下列java代 ...
- 解决“com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536”问题(l转)
同时在工程中引入了多个第三方jar包,导致调用的方法数超过了android设定的65536个(DEX 64K problem),进而导致dex无法生成,也就无法生成APK文件. 解决办法如下: 1.谷 ...
- 详细介绍windows下使用python pylot进行网站压力测试
windows下使用python进行网站压力测试,有两个必不可少的程序需要安装,一个是python,另一个是pylot.python是一个安装软件,用来运行python程序,而pylot则是pytho ...
- 面向对象设计的SOLID原则
S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...
- Python Base HTTP Server
import BaseHTTPServer import cgi, random, sys MESSAGES = [ "That's as maybe, it's still a frog. ...