sqlserver中复合索引和include索引到底有多大区别?

一:从数据页角度看问题

1. 做两个表,插入两条数据,在test1上做复合索引,在test2上做include索引,如下图:

2. 然后通过DBCC 命令查看数据页记录

<1> 先来看看test1表中各个槽位的信息

1 DBCC TRACEON(2588,3604)
2 DBCC IND(Ctrip,test1,-1)
3 DBCC PAGE(Ctrip,1,194,1)
1 DBCC TRACEON(2588,3604) 2 DBCC IND(Ctrip,test1,-1) 3 DBCC PAGE(Ctrip,1,194,1)

<2> 再来看看test2表中各个槽位信息

1 DBCC TRACEON(2588,3604)
2 DBCC IND(Ctrip,test2,-1)
3 DBCC PAGE(Ctrip,1,207,1)
1 DBCC TRACEON(2588,3604) 2 DBCC IND(Ctrip,test2,-1) 3 DBCC PAGE(Ctrip,1,207,1)

<3> 从test1和test2的数据页来看,都是有两个slot槽位,然后我们把test1和test2的slot0槽位拿出来对比下,是不是就知道两者大概有什么区别了。

test1のslot0

test2のslot0

下面我仔细解剖下两表中的slot内容:

16 6161616161 3131314071712e636f6d c0000000 0100 0000 0300 00

16:   这个是索引记录的系统头数据。

6161616161:   转换成十进制就是9797979797,也就是字符的aaaaa。

c000000010000000: 因为我们是堆表,所以这个就是表的RowID,转化为十进制就是: 192:1:0。

0300: 这个表示表中的记录数,也就是3条记录。

么问题呢???如果你对记录比较熟悉的话,你就知道,其实记录中的变长字段值一般都是放在记录的尾部。。。好处就是可以做到“行溢出”。也就是

可以超过索引的900长度限制。。。而复合索引却无法做到。。。如果你不信我可以做个例子,将name和email的长度设为定长500。

而include索引却可以顺利通过。。。。。

经验分享 程序员 微信小程序 职场和发展