这一篇再说下索引的最后一个主题,索引覆盖,当然学习比较好的捷径是看看那些大师们设计的索引,看从中能提取些什么营养的东西,下面我们看

看数据库中一个核心的Orders表。

  

一:查看表的架构

<1> 先查看这个表的大概架构信息

 --查看表的架构信息
SELECT c.column_id,c.name,t.name FROM sys.columns AS c
JOIN sys.types t
ON c.system_type_id=t.system_type_id
WHERE c.object_id=object_id('O_Orders')
ORDER BY c.column_id

从这个订单表来看大概有89个字段。。。还是蛮多的,可能有太多的历史原因吧,下面就有一个疑问来了,针对这么多的字段加上五花八门的类型,如何规划

好单列索引和复合索引。。。下面我们来看看这些专家们怎么设计的。

<2> 复合索引

  首先声明一下,由于我的权限有限,不能进行DBCC IND,PAGE等命令,所以我没有能力判断下面的索引是include索引还是复合索引,所以这里统一叫成

复合索引吧。

 SELECT name,type_desc FROM sys.indexes WHERE object_id=object_id('O_Orders')

从上面可以看到,有9个非聚集索引,1个聚集索引,然后可以通过 SHOW_STATISTICS 抽查几个索引看看到底关联了哪些字段,找到其中的二个索引,

覆盖多达6列,如索引"idx_order_status_2","IX_O_OrdersUID"。

DBCC SHOW_STATISTICS(O_Orders,idx_order_status_2)
DBCC SHOW_STATISTICS(O_Orders,IX_O_OrdersUID)

从这两个索引中关联的字段大概可以看出两点信息:

①:这些字段都比较小,为char(1),smallint,bit这样的,自然表示的状态会比较少。

②:将表中多个状态少的字段挑选几个按照访问频率组合在一起做一个索引。

但是仔细想想,虽然原则上说状态少的字段不合适建索引,但是类似“订单状态(OrderStatus”这种字段,肯定是一个被频繁查询的列。。。既然是频繁的列,

肯定就要想办法优化,方法就是建复合索引,这样在复杂的sql中更加容易被撞上索引覆盖。

比如下面这样:

 SET STATISTICS IO ON
SELECT OrderStatus, ProcessStatus, SendTicketCity, FlightAgency, Eticket, OrderID
FROM dbo.Orders WHERE OrderStatus='P' AND ProcessStatus='' AND SendTicketCity=1

然后继续挑选几个索引瞄一瞄。。。一般来说,覆盖1到2个列的索引都叫小索引。

 DBCC SHOW_STATISTICS(O_Orders,idx_eid_orderdate)
DBCC SHOW_STATISTICS(O_Orders,IX_O_Order_FinishDate)

通过上面的索引大概可以看到,Eid和FinishDate这两列,一眼扫过就知道应该是一个唯一性比较高的列了,至于为什么要覆盖2列,那这个就是根据业务

和生产的滚动数据来决定了,那这样的索引有什么好处呢?同样更容易会撞到索引链接,也就是多条件中会走到多个索引,每个索引中贡献一些列刚好可以

满足select中的所有列。。。比如下面这样。

 -- 可以看到,select中的所有列都是有idx_eid_orderdate 和 IX_O_Order_FinishDate 贡献
SELECT OrderID,FinishDate,PrepayType,Eid,OrderDate
FROM dbo.O_Orders WHERE Eid='cctv1' AND FinishDate>2015-1-1

好了,就像园友说的,索引就是拆东墙补西墙,每建一个索引都需要评估它的利弊。

Sql Server之旅——第九站 看公司这些DBA们设计的这些复合索引的更多相关文章

  1. Sql Server之旅——第二站 理解万恶的表扫描

    很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是撸一管子回来,那个小球还在一直转...这个着急也只有当事人才 明白,后来听说有个什么“评估执行计划“,后来的后来才明白应该 ...

  2. Sql Server之旅——第一站 那些给我们带来福利的系统视图

    本来想这个系列写点什么好呢,后来想想大家作为程序员,用的最多的莫过于数据库了,但是事实上很多像我这样工作在一线的码农,对sql 都一知半解,别谈优化和对数据库底层的认识了,我也是这样... 一:那些系 ...

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

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

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

    索引和锁,这两个主题对我们开发工程师来说,非常的重要...只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的 索引都是单列索引...当然数据库不可能只认单列索引,还有我这篇 ...

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

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

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

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

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

    说到sql的参数化处理,我也是醉了,因为sql引擎真的是一个无比强大的系统,我们平时做系统的时候都会加上缓存,我想如果没有缓存,就不会有什么 大网站能跑的起来,而且大公司一般会在一个东西上做的比较用心 ...

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

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

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

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

随机推荐

  1. VS使用WinRAR软件以命令行方式打包软件至一个exe

    由于项目需要,需要将一个绿色版软件(即无需在C盘写入文件)发给客户使用,要求是只有一个exe文件,双击即可执行.​ 网上说WinRAR软件创建自解压文件可以实现,链接http://blog.csdn. ...

  2. Git远程和分支管理

    一.远程       Git是分布式版本控制系统,最重要的优点就是远程仓库托管代码.不用自己搭建一个服务器,在github上面注册一个账户就可免费获取远程仓库.      首先需要先在github上面 ...

  3. 通过C#来加载X509格式证书文件并生成RSA对象

    private static RSACryptoServiceProvider GetPrivateKey(string priKeyFile, string keyPwd) { var pc = n ...

  4. MongoDB环境准备

    1.安装MongoDB MongoDB的安装非常简单,只需要将下载的MongoDB的压缩文件解压到任意目录,并将其中的bin目录加入到系统的path环境变量中即可 2.启动MongoDB 在启动Mon ...

  5. [转载]jQuery诞生记-原理与机制

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3520 一.看似偶然的 ...

  6. 重新初始化 VS2010

    开始->所有程序->Microsoft Visual Stdio 2005->Visual Stdio Tools->Visual Stdio 2005 命令提示 这时会弹出一 ...

  7. jQuery Danmmu Player 弹幕视频

    Danmmu Player是基于jQuery的弹幕视频插件.当在看视频的时候,同时发表自己的观点,这样很好的提高用户互动效果.其实也就是在视频界面上做一个滚动展示动画效果,这样的聊天互动视频效果我们叫 ...

  8. 未来的 Web:九个不可思议的 WebGL 应用试验

    WebGL 技术允许把 JavaScript 和 OpenGL ES 2.0 结合在一起,通过增加 OpenGL ES 2.0 的一个 JavaScript 绑定,WebGL 可以为 HTML5 Ca ...

  9. ssh框架搭建的基本步骤(以及各部分作用)

    ssh框架搭建的基本步骤(以及各部分作用)     一.首先,明确spring,struts,hibernate在环境中各自的作用.   struts: 用来响应用户的action,对应到相应的类进行 ...

  10. Javascript数组算法和技巧总结

    Js-arrayMethod https://github.com/HerbertKarajan/Js-arrayMethod List unique an array 数组去重 random str ...