Sql Server之旅——第八站 复合索引和include索引到底有多大区别?
周末终于搬进出租房了,装了宽带。。。。才发现没网的日子。。。那是一个怎样的与世隔绝呀。。。再也受不了那样的日子了。。。。好了,既然网
安上去了,还得继续我的这个系列。
索引和锁,这两个主题对我们开发工程师来说,非常的重要。。。只有理解了这两个主题,我们才能写出高质量的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索引却可以顺利通过。。。。。
这几天上海特别冷,打字都打着手哆嗦。。。不准备继续说了。。。下一篇继续扯下复合索引到底都能带来哪些好处。
Sql Server之旅——第八站 复合索引和include索引到底有多大区别?的更多相关文章
- (转)Sql Server之旅——第八站 复合索引和include索引到底有多大区别?
索引和锁,这两个主题对我们开发工程师来说,非常的重要...只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的 索引都是单列索引...当然数据库不可能只认单列索引,还有我这篇 ...
- Sql Server之旅——第十站 看看DML操作对索引的影响
我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,我们也知道建索引是需要维护成本的,这个维护也就在于DML操作了, 下面我们具体看看到底DML对索引都有哪些内幕.... 一:delete操作 ...
- Sql Server之旅——第五站 确实不得不说的DBCC命令
原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好 ...
- Sql Server之旅——第四站 你必须知道的非聚集索引扫描
非聚集索引,这个是大家都非常熟悉的一个东西,有时候我们由于业务原因,sql写的非常复杂,需要join很多张表,然后就泪流满面了...这时候就 有DBA或者资深的开发给你看这个猥琐的sql,通过执行计划 ...
- Sql Server之旅——第十一站 简单说说sqlserver的执行计划
我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样 就可以方便的找到sql的缺陷和优化点. 一:执行计划生成过程 说到执 ...
- Sql Server之旅——第七站 为什么都说状态少的字段不能建索引
我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道, 或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说 ...
- Sql Server之旅——第六站 使用winHex利器加深理解数据页
这篇我来介绍一个winhex利器,这个工具网上有介绍,用途大着呢,可以用来玩数据修复,恢复删除文件等等....它能够将一个file解析成 hex形式,这样你就可以对hex进行修改,然后你就可以看到修复 ...
- Sql Server之旅——第十三站 对锁的初步认识
终于这个系列快结束了,马上又要过年了,没什么心情写博客...作为一个开发人员,锁机制也是我们程序员必须掌握的东西,很久之前 在学习锁的时候,都是教科书上怎么说,然后我怎么背,缺少一个工具让我们眼见为实 ...
- Sql Server之旅——第五站 确实不得不说的DBCC命令(文后附年会福利)
今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好 ceo从美国带了干红回来,然后我就顺道开心的过了把瘾....一个字.. ...
随机推荐
- MVP 2015社区大讲堂之:在ASP.NET应用中执行后台任务
昨天下午,在微软的MVP 2015社区大讲堂上给大家分享了一个题目:在ASP.NET应用中执行后台任务.这是一点都不高大上,并且还有点土气的技术分享.不过我相信很多人都遇到过这样的问题. 虽然是一个很 ...
- MySQL Error Handling in Stored Procedures
http://www.mysqltutorial.org/mysql-error-handling-in-stored-procedures/ mysql存储过程中的异常处理 定义异常捕获类型及处 ...
- HDU 5091---Beam Cannon(线段树+扫描线)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5091 Problem Description Recently, the γ galaxies bro ...
- JVM内存格局总结
最近一次面试,面试官让我讲讲JVM的内存这一块的理解.我回答的不满意,今天做一个总结. 做一个产品,最终要做到高并发.高可靠.归根结底,是对CPU.内存等资源受限所作出的解决方案.就内存而言,我们写的 ...
- ASP.NET MVC下使用文件上传
这里我通过使用uploadify组件来实现异步无刷新多文件上传功能. 1.首先下载组件包uploadify,我这里使用的版本是3.1 2.下载后解压,将组件包拷贝到MVC项目中 3. 根目录下添加新 ...
- Java经典实例:按字符颠倒字符串
使用StringBuilder类的reverse()方法来实现. /** * Created by Frank */ public class StringRevChar { public stati ...
- GJM : Python简单爬虫入门 (一) [转载]
版权声明:本文原创发表于 [请点击连接前往] ,未经作者同意必须保留此段声明!如有侵权请联系我删帖处理! 为大家介绍一个简单的爬虫工具BeautifulSoup BeautifulSoup拥有强大的解 ...
- WinForm 窗体应用程序(初步)之一
学习制作一个WinForm程序,有两样东西是需要首先掌握的.第一部分,我们称之为属性面板.无论是窗体还是控件,都有着自己的属性面板.第二部分,则是我们称之为控件的东西. 我们先来讨论一下属性面板.新建 ...
- ENVI软件操作之【数据的显示操作】
数据的显示操作主要包括以下的一些简单窗口操作 1.文件列表管理 1)可用的波段列表Available Bands List,使用于存取ENVI图像文件和显示图像文件的主要控制对话框.无论何时何地打开一 ...
- 将数据导入PostGIS
#!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess # database options db_schema = " ...