一个为标准化化但众所周知的DBCC IND命令返回关于表页面分配的信息。你可以在图1-8中看到该命令的输出。
表1-8 DBCC IND 输出
有两页是属于这个表的。第一个它的页面类型=10,是一种特殊类型的页面,称为IAM分配映射。这个页面属于特定对象的页面。但是,现在不要把焦点放在这里,因为我们将在本章后面讨论分配映射页面。
提示:SQL Server 2012引入了另一个未标准化的数据管理功能(DMF) ,sys.dm_db_ database_page_allocations可以用作DBCC IND命令的替代。与DBCC IND相比,此DMF的输出提供了更多信息,并且可以与其他系统dmv和/或目录视图连接。
页面类型=1的页面是包含数据行的实际数据页。页面文件编码和页码列显示了页面的实际文件和页码。你可以使用另一个未标准化的命令DBCC PAGE来检查其内容,如列表1-5所示。
列表1-5 数据行格式:DBCC PAGE 调用
列表1-6显示了对应于第一行数据的DBCC页面的输出。SQL Server以字节交换的顺序存储数据。例如,两个字节的值0001将存储为0100。
图1-9 第一数据行
正如你所看到的,行从两个状态位开始,然后是值为0800的两个字节。0008是字节交换值,是行中列数属性的偏移量。这个偏移量告诉SQL Server行中固定长度的数据部分在哪里结束。接下来的4个字节用于存储固定长度的数据,在我们的示例中是ID列。然后是两个字节的值,该值显示数据行有四列,然后是一个一个字节的空位图。如果只有四列,位图中的一个字节就足够了。它以二进制格式存储04的值,即00000100。它表示行中的第三列包含空值。接下来的两个字节存储行中可变长度列的数量,即3(字节顺序为0300)。它后面是一个偏移量数组,其中每两个字节存储变量列数据结束的偏移量。如您所见,即使Col2为NULL,它仍然使用偏移数组中的插槽。最后,还有来自可变长度列的实际数据。现在,让我们看看第二个数据行。清单1-7显示DBCC页面输出,图1-10显示行数据。
第二行中的NULL位图表示二进制值00001010,这表明Col1和Col3是NULL。即使表有三个可变长列,行中可变长列的数量表明偏移数组中只有两列/槽。SQL Server不维护行中尾随的空变长列的信息。
提示:你可以通过创建表来减少数据行的大小,方法是将通常存储null值的变长列定义为CREATE TABLE语句中的最后一列。这是CREATE TABLE语句中列的顺序唯一重要的情况
固定长度的数据和内部属性必须适合单个数据页上可用的8060字节。如果不是这样,SQL Server不允许你创建表。例如,列表1-8中的代码产生了一个错误。
创建或更改表“BadTable”失败,因为最小行大小为8067,包括7字节的内部开销。这超过了表行大小为8060字节的最大允许值。