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索引却可以顺利通过。。。。。