索引和锁,这两个主题对我们开发工程师来说,非常的重要。。。只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的

索引都是单列索引。。。当然数据库不可能只认单列索引,还有我这篇的复合索引,说到复合索引,可能熟悉的人又会说到include索引,那这两个索引到底

有什么区别呢,当然我也是菜鸟一枚。。。所以下面的也是我的个人见解。。。

一:从数据页角度看问题

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

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

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

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

1 DBCC TRACEON(2588,3604)
2 DBCC IND(Ctrip,test1,-1)
3 DBCC PAGE(Ctrip,1,194,1)
 1 Slot 0, Offset 0x60, Length 27, DumpStyle BYTE
2
3 Record Type = INDEX_RECORD Record Attributes = NULL_BITMAP Record Size = 27
4
5 Memory Dump @0x000000000FB0A060
6
7 0000000000000000: 16616161 61613131 31407171 2e636f6d †.aaaaa111@qq.com
8 0000000000000010: c0000000 01000000 030000†††††††††††††...........
9
10 Slot 1, Offset 0x7b, Length 27, DumpStyle BYTE
11
12 Record Type = INDEX_RECORD Record Attributes = NULL_BITMAP Record Size = 27
13
14 Memory Dump @0x000000000FB0A07B
15
16 0000000000000000: 16626262 62623232 32407171 2e636f6d †.bbbbb222@qq.com
17 0000000000000010: c0000000 01000100 030000†††††††††††††...........
18
19 OFFSET TABLE:
20
21 Row - Offset
22 1 (0x1) - 123 (0x7b)
23 0 (0x0) - 96 (0x60)

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

1 DBCC TRACEON(2588,3604)
2 DBCC IND(Ctrip,test2,-1)
3 DBCC PAGE(Ctrip,1,207,1)
 1 Slot 0, Offset 0x60, Length 27, DumpStyle BYTE
2
3 Record Type = INDEX_RECORD Record Attributes = NULL_BITMAP Record Size = 27
4
5 Memory Dump @0x000000000DFCA060
6
7 0000000000000000: 16616161 6161c400 00000100 00003131 †.aaaaa........11
8 0000000000000010: 31407171 2e636f6d 030000†††††††††††††1@qq.com...
9
10 Slot 1, Offset 0x7b, Length 27, DumpStyle BYTE
11
12 Record Type = INDEX_RECORD Record Attributes = NULL_BITMAP Record Size = 27
13
14 Memory Dump @0x000000000DFCA07B
15
16 0000000000000000: 16626262 6262c400 00000100 01003232 †.bbbbb........22
17 0000000000000010: 32407171 2e636f6d 030000†††††††††††††2@qq.com...
18
19 OFFSET TABLE:
20
21 Row - Offset
22 1 (0x1) - 123 (0x7b)
23 0 (0x0) - 96 (0x60)

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

test1のslot0

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

test2のslot0

1 0000000000000000:   16616161 6161c400 00000100 00003131 †.aaaaa........11
2 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索引却可以顺利通过。。。。。

转:一线码农    Sql Server之旅——第八站 复合索引和include索引到底有多大区别?

(转)Sql Server之旅——第八站 复合索引和include索引到底有多大区别?的更多相关文章

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

    周末终于搬进出租房了,装了宽带....才发现没网的日子...那是一个怎样的与世隔绝呀...再也受不了那样的日子了....好了,既然网 安上去了,还得继续我的这个系列. 索引和锁,这两个主题对我们开发工 ...

  2. Sql Server之旅——第十站 看看DML操作对索引的影响

    我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,我们也知道建索引是需要维护成本的,这个维护也就在于DML操作了, 下面我们具体看看到底DML对索引都有哪些内幕.... 一:delete操作 ...

  3. Sql Server之旅——第五站 确实不得不说的DBCC命令

    原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好 ...

  4. Sql Server之旅——第四站 你必须知道的非聚集索引扫描

    非聚集索引,这个是大家都非常熟悉的一个东西,有时候我们由于业务原因,sql写的非常复杂,需要join很多张表,然后就泪流满面了...这时候就 有DBA或者资深的开发给你看这个猥琐的sql,通过执行计划 ...

  5. Sql Server之旅——第十一站 简单说说sqlserver的执行计划

    我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样 就可以方便的找到sql的缺陷和优化点. 一:执行计划生成过程 说到执 ...

  6. Sql Server之旅——第七站 为什么都说状态少的字段不能建索引

    我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道, 或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说 ...

  7. Sql Server之旅——第六站 使用winHex利器加深理解数据页

    这篇我来介绍一个winhex利器,这个工具网上有介绍,用途大着呢,可以用来玩数据修复,恢复删除文件等等....它能够将一个file解析成 hex形式,这样你就可以对hex进行修改,然后你就可以看到修复 ...

  8. Sql Server之旅——第十三站 对锁的初步认识

    终于这个系列快结束了,马上又要过年了,没什么心情写博客...作为一个开发人员,锁机制也是我们程序员必须掌握的东西,很久之前 在学习锁的时候,都是教科书上怎么说,然后我怎么背,缺少一个工具让我们眼见为实 ...

  9. Sql Server之旅——第五站 确实不得不说的DBCC命令(文后附年会福利)

    今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好 ceo从美国带了干红回来,然后我就顺道开心的过了把瘾....一个字.. ...

随机推荐

  1. [转] 菜鸟手脱VMP,附上脱壳过程和自己写的脚本,可跨平台

    转载:http://www.52pojie.cn/thread-467703-1-1.html 工作需要要脱一个VMP壳,我是一个从来没接触过脱壳的人.瞬间那种心情遇到的人应该都知道!没办法硬着头皮找 ...

  2. 关于actor-critic,这篇文章写的很好

    这篇文章: https://blog.csdn.net/qq_30615903/article/details/80774384 可以好好温习,包括代码,基本看懂了.

  3. Java Web学习总结-文件下载

    参考资料:https://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件 ...

  4. CarbonData编译与安装

    原文连接 http://xiguada.org/carbondata_compile/ CarbonData是啥? CarbonData is a fully indexed columnar and ...

  5. php 上传视频的代码,

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  6. 【3】利用Word模板生成文档的总结

    阅读目录 Word二次开发概况 使用DsoFramer进行开发 使用Interop进行开发 打开.关闭和写入操作 批量替换文本 遍历段落替换文本 查找后逐个替换文本 结论 在各类应用系统开发中,和Wo ...

  7. centos下docker网络桥接

    停止服务 停止docker0网卡 Ip link set dev docker0 down 删除docker0 Brctl delbr docker0 进入到网卡的配置文件创建桥接网络br0 Brct ...

  8. python中各类时间的计算

    python获取当前系统时间: nowTime=time.localtime() 获取当前系统日期: nowDate=datetime.datetime(nowTime[0],nowTime[1],n ...

  9. ARC下 does not support automated __weak references错误

    ARC下 does not support automated __weak references错误 此错误,通常是你的ARC下不支持weak 把你项目里面,weak的地方 改为 unsafe_un ...

  10. 算法笔记_153:算法提高 判断名次(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话.(经典的开头……-_-!)得了第1名的人23,说了假话:得 ...