索引和锁,这两个主题对我们开发工程师来说,非常的重要。。。只有理解了这两个主题,我们才能写出高质量的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 BYTERecord Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 27Memory Dump @0x000000000FB0A0600000000000000000:   16616161 61613131 31407171 2e636f6d †.aaaaa111@qq.com
0000000000000010:   c0000000 01000000 030000†††††††††††††...........Slot 1, Offset 0x7b, Length 27, DumpStyle BYTERecord Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 27Memory Dump @0x000000000FB0A07B0000000000000000:   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 BYTERecord Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 27Memory Dump @0x000000000DFCA0600000000000000000:   16616161 6161c400 00000100 00003131 †.aaaaa........11
0000000000000010:   31407171 2e636f6d 030000†††††††††††††1@qq.com...Slot 1, Offset 0x7b, Length 27, DumpStyle BYTERecord Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 27Memory Dump @0x000000000DFCA07B0000000000000000:   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索引却可以顺利通过。。。。。

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

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

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

    原文:Sql Server之旅--第十一站 简单说说sqlserver的执行计划 我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么 ...

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

    Sql Server之旅--第五站 确实不得不说的DBCC命令 原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干 ...

  3. Sql Server之旅——第八站 看公司这些DBA们设计的这些复合索引

    这一篇再说下索引的最后一个主题,索引覆盖,当然学习比较好的捷径是看看那些大师们设计的索引,看从中能提取些什么营养的东西,下面我们看看数据库中一个核心的Orders表. 一:查看表的架构 1. 先查看这 ...

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

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

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

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

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

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

  7. Sql Server之旅——第十三站 深入的探讨锁机制

    上一篇我只是做了一个堆表让大家初步的认识到锁的痉挛状态,但是在现实世界上并没有这么简单的事情,起码我的表不会没有索引对吧,还有就是我的表一定会有很多的连接过来,10:1的读写,很多码农可能都会遇到类似 ...

  8. Sql Server之旅——第三站 解惑那些背了多年聚集索引的人

    说到聚集索引,我想每个码农都明白,但是也有很多像我这样的伪程序员,只能用死记硬背来解决这个问题,什么表中只能建一个聚集索引,然后又扯到了目录查找来帮助读者记忆....问题就在这里,我们不是学文科,,, ...

  9. Sql Server之旅——第十二站 sqltext的参数化处理

    Sql Server之旅--第十二站 sqltext的参数化处理 原文:Sql Server之旅--第十二站 sqltext的参数化处理 说到sql的参数化处理,我也是醉了,因为sql引擎真的是一个无 ...

最新文章

  1. 腾讯——这可是一只“骨骼清奇”的狗
  2. admui3字体无法删除_被微信好友删除、拉黑还不知?这3个方法可以自查,看完涨知识了...
  3. chrome浏览器 新建 标签 页面 跳转到主页(或跳转到谷歌)
  4. 关于开源软件的书籍一定要尽量提供搭配好的软件版本
  5. java 抽样_Java编程实现二项分布的采样或抽样实例代码
  6. [苹果技巧]苹果系统用于系统监控和管理的命令
  7. 在Vue中为什么需要组合API
  8. code collection 0.44版 发布
  9. 电脑音频,realtek高清晰音频管理器
  10. android http 302重定向 实现,Android httpClient自动处理302重定向
  11. Hadoop生态圈之即席查询工具Presto
  12. 关键字const有什么含意?
  13. html中鼠标点击效果的制作,用CSS实现鼠标单击特效-网页设计,HTML/CSS
  14. 求两个字符串的最大连续公共字串
  15. 数据仓库-Hive(一)
  16. 炒股杠杆放大多少合适
  17. 计算机专业生物信息方向博士,我是这样拿到宾大生物信息学全奖博士offer的
  18. 怎么打开avi文件文件损坏_什么是AVI文件(以及如何打开一个文件)?
  19. 浅谈JVM(面试常考)
  20. Are You Talking to Me? Reasoned Visual Dialog Generation through Adversarial Learning

热门文章

  1. Linux - 命令
  2. 转:iOS-CoreLocation:无论你在哪里,我都要找到你!
  3. java反射--注解的定义与运用以及权限拦截
  4. iphone4 短信截获
  5. CentOS+lighttpd+php+mysql (fastcgi)环境的搭建(转)
  6. kindle阅读_如何在Kindle上清除最远的阅读页面
  7. SpringBoot获取ApplicationContext
  8. illegal multibyte sequence python3
  9. 组装电脑教程(转载)
  10. 第十周项目1-程序填空与阅读(一)