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数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...
随机推荐
- RUF MVC5 Repositories Framework Generator代码生成工具介绍和使用
RUF MVC5 Repositories Framework Generator代码生成工具介绍和使用 功能介绍 这个项目经过了大半年的持续更新到目前的阶段基本稳定 所有源代码都是开源的,在gith ...
- 了解 JavaScript (4)– 第一个 Web 应用程序
在下面的例子中,我们将要构建一个 Bingo 卡片游戏,每个示例演示 JavaScript 的不同方面,通过每次的改进将会得到最终有效的 Bingo 卡片. Bingo 卡片的内容 美国 Bingo ...
- GTD时间管理---非行动性
一:行动性和非行动有什么区别? 1:非行动性:指的是收集箱中的信息,是先存储后使用,这些信息平时都处于冬眠状态,只是要用到的时候能够找到它就好了.(偏向于处理生活) 2:行动性: 指的是收集箱中的信息 ...
- Expender Header 与 Content互斥展示
Expender 在展开时,Header 不展示:不展开时,展示 Header <Expander dxlc:DockLayoutControl.Dock="Top" IsE ...
- 为EasyUI 的Tab 标签添加右键菜单
在网上看了很多demo 自己实现了一个效果如下 ps jquery1.7.2 jQuery EasyUI 1.3.6easyui QQ群:15129679 <!doctype html> ...
- Scala 深入浅出实战经典 第46讲: ClassTag 、Manifest、ClasMainifest TagType实战
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 将ASP.NET Core应用程序部署至生产环境中(CentOS7)(转)
阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. 部署ASP.NET Core应用程序 配置Nginx 配置守 ...
- 网页内容导出word/excel的js代码
IE设置: 工具-> Internet选项-> 安全->自定义级别-> 对没有标记安全级别的ActiveX控件进行初始化 设为启用! 1.导出word //指定区域导出到Wo ...
- Difference between SET, SETQ and SETF in LISP
SET can set the value of symbols; SETQ can set the value of variables; SETF is a macro that will ...
- composite
#coding:utf-8 import math # 在确定函数前,我们先来了解下算法 # 有数 n 判断其是否是合数 # 如果 n 除以 range(2,math.sqrt(n)+1) 能够整除, ...