Sql Server之旅——第八站 看公司这些DBA们设计的这些复合索引
这一篇再说下索引的最后一个主题,索引覆盖,当然学习比较好的捷径是看看那些大师们设计的索引,看从中能提取些什么营养的东西,下面我们看看数据库中一个核心的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='1' 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们设计的这些复合索引相关推荐
- Sql Server之旅——第六站 为什么都说状态少的字段不能建索引
我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道,或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说. ...
- Sql Server之旅——第十一站 简单说说sqlserver的执行计划
原文:Sql Server之旅--第十一站 简单说说sqlserver的执行计划 我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么 ...
- Sql Server之旅——第五站 确实不得不说的DBCC命令
Sql Server之旅--第五站 确实不得不说的DBCC命令 原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干 ...
- Sql Server之旅——第四站 你必须知道的非聚集索引扫描
非聚集索引,这个是大家都非常熟悉的一个东西,有时候我们由于业务原因,sql写的非常复杂,需要join很多张表,然后就泪流满面了...这时候就有DBA或者资深的开发给你看这个猥琐的sql,通过执行计划一 ...
- Sql Server之旅——第七站 复合索引和include索引到底有多大区别?
索引和锁,这两个主题对我们开发工程师来说,非常的重要...只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的索引都是单列索引...当然数据库不可能只认单列索引,还有我这篇的 ...
- Sql Server之旅——第十站 简单说说sqlserver的执行计划
我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样 就可以方便的找到sql的缺陷和优化点. 一:执行计划生成过程 说到执 ...
- Sql Server之旅——第十三站 深入的探讨锁机制
上一篇我只是做了一个堆表让大家初步的认识到锁的痉挛状态,但是在现实世界上并没有这么简单的事情,起码我的表不会没有索引对吧,还有就是我的表一定会有很多的连接过来,10:1的读写,很多码农可能都会遇到类似 ...
- Sql Server之旅——第三站 解惑那些背了多年聚集索引的人
说到聚集索引,我想每个码农都明白,但是也有很多像我这样的伪程序员,只能用死记硬背来解决这个问题,什么表中只能建一个聚集索引,然后又扯到了目录查找来帮助读者记忆....问题就在这里,我们不是学文科,,, ...
- sqlserver怎么查看索引_Sql Server之旅——第六站 为什么都说状态少的字段不能建索引...
我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道,或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说. ...
最新文章
- python多线程读取文件的问题_Python多线程同步---文件读写控制方法
- 找回MySQL的root密码
- MVC之前的那点事儿系列(2):HttpRuntime详解分析(上)
- php实现数字滚动效果,vue如何实现数字滚动增加效果?代码示例
- 【Flink】Could not complete the operation,Number of retries has been exhausted
- easyui中的datetimebox 只显示年月日_云计算自动化运维之linux-工作中常用命令总结(中)...
- mysql仓库管理软件破解版_Max(TM)仓库管理软件|Max(TM)仓库管理系统下载_v2.0.5.1 MySQL网络版_9号软件下载...
- c语言while语句求奇数和,C语言 100以内奇数和 while语句
- 自制hdmi线一头改vga图_VGA连接线接口定义及引线焊接教程,VGA线不够长时可用网线代替?...
- C#使用欧姆龙PLC的Fins协议读写PLC地址(示例调用)
- UA用Mode-Driven的使用笔记
- html外联式怎么设置,笔记《三》-html引用css的三种方式-内联,嵌入,外联
- 解决CesiumForUnreal加入CesiumSunSky并调整设置后场景仍然纯白的问题
- layui+thymeleaf 点击弹框右上角叉号刷新父页面
- android 腾讯x5浏览器,【Android Web】腾讯X5浏览器的集成与常见问题
- 机器学习数学基础——群论
- BeanUtils只拷贝对象中属性值不为null的属性
- 让DNA说Hello!微软成功研制用DNA存储读取数据的全自动系统
- [SWPUCTF 2018]SimplePHP
- 2021-06-15常见网安设备默认口令大全