SQL Server如何在变长列上存储索引
作者:网络转载 发布时间:[ 2015/6/16 11:25:05 ] 推荐标签:数据库 SQL Server
我这里的根页是15058,我们使用DBCC PAGE命令查看下这个根页(记得先执行 DBCC TRACEON(3604))。
1 DBCC TRACEON (3604)
2 GO
3 --Dump out the root index page
4 DBCC PAGE(ALLOCATIONDB, 1, 15058, 1)
5 GO

即如下所示的数字:
00000000: 269d3b00 00010001 001b0043 7573746f ?&.;........Custo
00000010: 6d65724e 616d6531 333533?????????????merName1353
我们来分析下这些16进制值:
26 95020000 0100 0100 1b00 43757374 6f6d6572 4e616d65 31333533
26 第1个字节代表状态位
95020000 这4个字节代表索引记录指向的子页id(child-page-id)
0100 这2个字节代表索引记录指向的子文件id(child-file-id)
0100 这2个字节代表变长列数
1b00 这2个字节代表每个变长列结束为止的偏移量。每个变长列需要2字节。这个和在数据页里存储变长列一致。这里我们有1个变长列,因此SQL Server需要1个 2 byte的偏移量——27 byte的偏移量。这是说下一个字节一直到27 byte的偏移量都是我们变长列(聚集键)的组成部分。
43757374 6f6d6572 4e616d65 31333533 聚集键的16进制值,即CustomerName列。
从上面的解释,我们可以看出SQL Server存储变长索引列格式和数据页里存储变长列格式是一样的。但你要知道有一点额外开销,因为你需要额外2 bytes 来存储变长列个数,对于每个变长列在变长列偏移数组里需要2 bytes。在设计索引和计算一个索引页存放多少索引记录时,要留意这些存储开销。

sales@spasvo.com