页和区
SQL Server 中数据存储的基本单位是页。
区是由八个物理上连续的页构成的集合。 区有助于有效管理页。
本指南介绍用于管理所有版本的 SQL Server 中的页和区的数据结构。
要设计和开发高效执行的数据库,了解页和区的体系结构是很重要的。
SQL Server 中数据存储的基本单位是页。
为数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。
磁盘 I/O 操作在页级执行。 也就是说,SQL Server 读取或写入所有数据页。
区是八个物理上连续的页的集合,用来有效地管理页。
页.基础介绍
与常规书籍做类比:常规书籍中的所有内容都是写在书页上的。
与书籍类似,SQL Server 所有数据行都写在页面上。
书中的所有页都具有相同的物理大小。
同样,SQL Server 所有数据页大小均相同 - 8 KB。
书中的大多数页都包含数据(书的主要内容),某些页面包含有关内容的元数据(例如目录和索引)。
SQL Server 也是如此:大多数页包含由用户存储的实际数据行;这些称为数据页面和文本/图像页面(在特殊情况下)。
索引页包含有关数据位置的索引引用,最后有一些系统页,它们存储有关数据组织的各种元数据(PFS、GAM、SGAM、IAM、DCM、BCM 页)。
请参阅下表了解页面类型及其说明。
如前所述,在 SQL Server 中,页的大小为 8-KB。
这意味着 SQL Server 数据库中每 MB 有 128 页。
每页的开头是 96 字节的标头,用于存储有关页的系统信息。
此信息包括页码、页类型、页的可用空间以及拥有该页的对象的分配单元 ID。
页.类型
页类型 | 目录 |
---|---|
数据 | 当行中的文本设置为 ON 时,具有除 text、ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据以外的所有数据的数据行。 |
索引 | 索引条目。 |
Text/Image | 大型对象数据类型:(text、ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据) 数据行超过 8 KB 时为可变长度数据类型列:(varchar、nvarchar、varbinary 和 sql_variant) |
Global Allocation Map、Shared Global Allocation Map | 有关区是否分配的信息。 |
页可用空间 (PFS) | 有关页分配和页的可用空间的信息。 |
索引分配映射 (Index Allocation Map) | 有关每个分配单元中表或索引所使用的区的信息。 |
大容量更改映射表 | 有关每个分配单元中自最后一条 BACKUP LOG 语句之后的大容量操作所修改的区的信息。 |
差异更改映射表 | 有关每个分配单元中自最后一条 BACKUP DATABASE 语句之后更改的区的信息。 |
备注:日志文件不包含页,而是包含一系列日志记录。
(???页类型是在什么时候确定的???)
页.数据页
在数据页上,数据行紧接着标头按顺序放置。
页的末尾是行偏移表,对于页中的每一行,每个行偏移表都包含一个条目。
每个行偏移量条目记录对应行的第一个字节与页首的距离。
因此,行偏移量的功能有助于 SQL Server 快速在页面上定位行。 行偏移表中的条目的顺序与页中行的顺序相反。
行和列的概念,在这里出现的行和列,总感觉有点陌生.对行和列往底层的看,理解更深了一些.
遇到了比较大的行怎么办?
行不能跨页,但是行的部分可以移出行所在的页,因此行实际可能非常大。
页的单个行中的最大数据量和开销是 8,060 字节 (8-KB)。 但是,这不包括用 Text/Image 页类型存储的数据。
对于包含 varchar、nvarchar、varbinary 或 sql_variant 列的表,可以放宽此限制。
当表中的所有固定列和可变列的行的总大小超过限制的 8,060 字节时,
SQL Server 将从最大长度的列开始以动态方式将一个或多个可变长度列移动到 ROW_OVERFLOW_DATA 分配单元中的页。
每当插入或更新操作将行的总大小增大到超过限制的 8,060 字节时,将会执行此操作。
将列移动到 ROW_OVERFLOW_DATA 分配单元中的页后,将在 IN_ROW_DATA 分配单元中的原始页上维护 24 字节的指针。
如果后续操作减小了行的大小,SQL Server 会动态将列移回到原始数据页。
CREATE TABLE dbo.bigrows_fixed ( a char(3000), b char(3000), c char(2000), d char(60) ) ;
/*
消息 1701,级别 16,状态 1,第 2 行
创建或更改表 'bigrows_fixed' 失败,因为最小行大小是 8067,包括 7 字节的内部开销。而此值超出了允许的 8060 字节的最大表行大小。
*/
CREATE TABLE dbo.bigrows
(a varchar(3000),
b varchar(3000),
c varchar(3000),
d varchar(3000) );
--我们来确认一下SQL Server是如何存储行溢出数据的
INSERT INTO dbo.bigrows
SELECT REPLICATE('e', 2100), REPLICATE('f', 2100),
REPLICATE('g', 2100), REPLICATE('h', 2100);
SELECT object_name(object_id) AS name,
partition_id, partition_number AS pnum, rows,
allocation_unit_id AS au_id, type_desc as page_type_desc,
total_pages AS pages
FROM sys.partitions p JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE object_id=object_id('dbo.bigrows');
EXEC ('DBCC IND (test, bigrows, -1)')
/*DBCC是SQL Server提供的一组控制台命令,功能很强大,掌握一些必要的语句,对操作数据库有不少帮助...*/
总结
页大小
页类型
行溢出,页的处理方式