数据库.页

页和区

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 语句之后更改的区的信息。

备注:日志文件不包含页,而是包含一系列日志记录。

(???页类型是在什么时候确定的???)

页.数据页

6b14cbd1b42d7163148a853a46f021cc.gif

在数据页上,数据行紧接着标头按顺序放置。
页的末尾是行偏移表,对于页中的每一行,每个行偏移表都包含一个条目。
每个行偏移量条目记录对应行的第一个字节与页首的距离。
因此,行偏移量的功能有助于 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 字节的最大表行大小。
*/

07acebe4148e981ca44db855433db122.png

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提供的一组控制台命令,功能很强大,掌握一些必要的语句,对操作数据库有不少帮助...*/

ded4e9d198c6e1894fccaf78e54b8ddb.png

总结

页大小
页类型
行溢出,页的处理方式

摘抄文档

原文地址:https://www.cnblogs.com/love-zf/p/13556513.html