在 SQL Server 中,页的大小为 8 KB。这意味着 SQL Server 数据库中每 MB 有 128 页。每页的开头是 96 字节的标头,用于存储有关页的系统信息。此信息包括页码、页类型、页的可用空间以及拥有该页的对象的分配单元 ID。
下表说明了 SQL Server 数据库的数据文件中所使用的页类型。
|
页类型
|
内容
|
|---|
|
Data
|
当 text in row 设置为 ON 时,包含除 text、 ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据之外的所有数据的数据行。
|
|
Index
|
索引条目。
|
|
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
|
有关区是否分配的信息。
|
|
Page Free Space
|
有关页分配和页的可用空间的信息。
|
|
Index Allocation Map
|
有关每个分配单元中表或索引所使用的区的信息。
|
|
Bulk Changed Map
|
有关每个分配单元中自最后一条 BACKUP LOG 语句之后的大容量操作所修改的区的信息。
|
|
Differential Changed Map
|
有关每个分配单元中自最后一条 BACKUP DATABASE 语句之后更改的区的信息。
|
注意: |
|---|
|
日志文件不包含页,而是包含一系列日志记录。
|
在数据页上,数据行紧接着标头按顺序放置。页的末尾是行偏移表,对于页中的每一行,每个行偏移表都包含一个条目。每个条目记录对应行的第一个字节与页首的距离。行偏移表中的条目的顺序与页中行的顺序相反。
大型行支持
行不能跨页,但是行的部分可以移出行所在的页,因此行实际可能非常大。页的单个行中的最大数据量和开销是 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 会动态将列移回到原始数据页。有关详细信息,请参阅行溢出数据超过 8 KB。