SQL Server 中数据存储的基本单位是页。为数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间能够从逻辑上划分红页(从 0 到 n连续编号)。磁盘 I/O 操做在页级执行。也就是说,SQL Server 读取或写入全部数据页。sql
区是八个物理上连续的页的集合,用来有效地管理页。全部页都存储在区中。数据库
在 SQL Server 中,页的大小为 8 KB。这意味着 SQL Server 数据库中每 MB 有 128 页。每页的开头是 96 字节的标头,用于存储有关页的系统信息。此信息包括页码、页类型、页的可用空间以及拥有该页的对象的分配单元 ID。大数据
下表说明了 SQL Server 数据库的数据文件中所使用的页类型。spa
页类型指针
内容日志
Dataxml
当 text in row 设置为 ON 时,包含除 text、ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据以外的全部数据的数据行。对象
Index索引
索引条目。get
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 会动态将列移回到原始数据页。
区是管理空间的基本单位。一个区是八个物理上连续的页(即 64 KB)。这意味着 SQL Server 数据库中每 MB 有 16 个区。
为了使空间分配更有效,SQL Server 不会将全部区分配给包含少许数据的表。SQL Server 有两种类型的区:
统一区,由单个对象全部。区中的全部 8 页只能由所属对象使用。
混合区,最多可由八个对象共享。区中八页的每页可由不一样的对象全部。
一般从混合区向新表或索引分配页。当表或索引增加到 8 页时,将变成使用统一区进行后续分配。若是对现有表建立索引,而且该表包含的行足以在索引中生成 8 页,则对该索引的全部分配都使用统一区进行。