伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 教育考试 » 文章详细 订阅RssFeed

Sql Server之旅——第七站 复合索引和include索引到底有多大区别?

来源:本站原创 浏览:86次 时间:2022-12-15

索引和锁,这两个主题对我们开发工程师来说,非常的重要。。。只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的索引都是单列索引。。。当然数据库不可能只认单列索引,还有我这篇的复合索引,说到复合索引,可能熟悉的人又会说到include,那这两个索引到底有什么区别呢? 我也是菜鸟一枚。。。所以下面的也是我的个人见解。。。

一:从数据页角度看问题1. 做两个表,插入两条数据,在test1上做复合索引,在test2上做include索引,如下图:

-- 在test1表中插入2条记录
CREATE TABLE test1(ID int,Name CHAR(5),Email CHAR(10))
INSERT INTO test1 VALUES(1,'aaaaa','111@qq.com')
INSERT INTO test1 VALUES(2,'bbbbb','222@qq.com')
CREATE INDEX idx_test1 ON dbo.test1(Name,Email)

-- 在test2表中插入2条记录
CREATE TABLE test2(ID int,Name CHAR(5),Email CHAR(10))
INSERT INTO test2 VALUES(1,'aaaaa','111@qq.com')
INSERT INTO test2 VALUES(2,'bbbbb','222@qq.com')
CREATE INDEX idx_test2 ON dbo.test2(Name) INCLUDE(Email)
2. 然后通过DBCC 命令查看数据页记录<1> 先来看看test1表中各个槽位的信息

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

Slot 0, Offset 0x60, Length 27, DumpStyle BYTE

Record Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 27

Memory Dump @0x000000000FB0A060

0000000000000000:   16616161 61613131 31407171 2e636f6d †.aaaaa111@qq.com
0000000000000010:   c0000000 01000000 030000†††††††††††††...........

Slot 1, Offset 0x7b, Length 27, DumpStyle BYTE

Record Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 27

Memory Dump @0x000000000FB0A07B

0000000000000000:   16626262 62623232 32407171 2e636f6d †.bbbbb222@qq.com
0000000000000010:   c0000000 01000100 030000†††††††††††††...........

OFFSET TABLE:

Row - Offset
1 (0x1) - 123 (0x7b)
0 (0x0) - 96 (0x60)
<2> 再来看看test2表中各个槽位信息

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

Slot 0, Offset 0x60, Length 27, DumpStyle BYTE

Record Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 27

Memory Dump @0x000000000DFCA060

0000000000000000:   16616161 6161c400 00000100 00003131 †.aaaaa........11
0000000000000010:   31407171 2e636f6d 030000†††††††††††††1@qq.com...

Slot 1, Offset 0x7b, Length 27, DumpStyle BYTE

Record Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 27

Memory Dump @0x000000000DFCA07B

0000000000000000:   16626262 6262c400 00000100 01003232 †.bbbbb........22
0000000000000010:   32407171 2e636f6d 030000†††††††††††††2@qq.com...

OFFSET TABLE:

Row - Offset
1 (0x1) - 123 (0x7b)
0 (0x0) - 96 (0x60)
<3> 从test1和test2的数据页来看,都是有两个slot槽位,然后我们把test1和test2的slot0槽位拿出来对比下,是不是就知道两者大概有什么区别了。

test1のslot0


0000000000000000:   16616161 61613131 31407171 2e636f6d †.aaaaa111@qq.com
0000000000000010:   c0000000 01000000 030000†††††††††††††...........

test2のslot0


0000000000000000:   16616161 6161c400 00000100 00003131 †.aaaaa........11
0000000000000010:   31407171 2e636f6d 030000†††††††††††††1@qq.com...

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

  • 16 6161616161 3131314071712e636f6d c0000000 0100 0000 0300 00

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

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

3131314071712e636f6d: 这个我想你也懂,也就是111@qq.com。

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

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

如果你对上面的讲解明白了,那我们继续看看test2のslot0,如果你仔细的话,你会看到在test2中,111qq.com是在记录的最后。。。那这说明什么问题呢???如果你对记录比较熟悉的话,你就知道,其实记录中的变长字段值一般都是放在记录的尾部。。。好处就是可以做到“行溢出”。也就是可以超过索引的900长度限制。。。而复合索引却无法做到。。。如果你不信我可以做个例子,将name和email的长度设为定长500。

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

夜深了,不准备继续说了。。。下一篇继续扯下复合索引到底都能带来哪些好处。


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net