第六章——根据执行计划优化性能(2)——查找表/索引扫描
来源:互联网 发布:软件开发框架设计 编辑:程序博客网 时间:2024/06/06 01:40
前言:
在绝大部分情况下,特别是从一个大表中返回少量数据时,表扫描或者索引扫描并不是一种高效的方式。这些必须找出来并解决它们从而提高性能,因为扫描将遍历每一行,查找符合条件的数据,然后返回结果。这种处理是相当耗时耗资源的。在性能优化过程中,一般集中于:
1、 CPU
2、 Network
3、 磁盘IO
而扫描操作会增加这三种资源的开销。
准备工作:
下面将创建两个表来查看不同的物理关联操作的不同影响。创建脚本已经在本系列的第一篇中给出,这里不再显示。
步骤:
1、 打开执行计划并运行下面查询:
SELECT sh.*FROM SalesOrdDetailDemo AS sd INNER JOIN SalesOrdHeaderDemo AS sh ON sh.salesorderID = sd.salesorderidWHERE sh.orderdate = '2004-07-31 00:00:00.000'GO
从执行计划的截图可以看到两表均使用了表扫描,其中执行计划建议了丢失索引。此时应该考虑是否有必要创建:
2、 为了避免表扫描,创建一个聚集索引在表SalesOrdHeaderDemo中:
CREATE UNIQUE CLUSTERED INDEX idx_salesorderheaderdemo_SalesOrderID ON salesordheaderdemo(SalesOrderID)GO
3、 再次运行步骤1中的查询,看看执行计划是否已经移除了表扫描:
4、 上图中可以看到创建了聚集索引的表已经变成了聚集索引扫描,但是未创建的就还是表扫描,观察聚集索引扫描,它只是把表扫描换成了聚集索引扫描,所以没有很大的性能提升。
5、 现在继续把第二个表的表扫描去掉,通过创建在这个表上的唯一聚集索引:
CREATE UNIQUE CLUSTERED INDEX idx_SalesDetail_SalesOrderID ON SalesOrdDetailDemo(SalesOrderID,SalesOrderDetailID)GO
6、 再次执行查询。
7、 下面截图中可以看到表扫描已经彻底移除:
分析:
在深入讨论之前,首选需要澄清的是,扫描并不总是坏的,而查找并不总是好的,但是在绝大部分情况下,特别是在大表中返回少量数据时,查找会有更好的性能表现。同样,并不总是有方法在每个查询中移除扫描操作。如果查询的性能问题是因为扫描,那么移除扫描操作会更好,否则,看看是否有什么改变方式去提高性能。
在第一步中,因为两表均没有索引,所以优化器只能选择扫描来查找数据。
在第三步中,已经创建了一个聚集索引在SalesOrdHeaderDemo表上,表扫描变成了聚集索引扫描,聚集索引查找是我们希望得到的结果,但是因为我们没有什么谓词在第一个表上,所以只能扫描整个聚集索引来代替扫描整个表。
在第六步中,在第二个表也创建了聚集索引,且有一个谓词在这个表上,所以出现了聚集索引查找,而不是聚集索引扫描。
- 第六章——根据执行计划优化性能(2)——查找表/索引扫描
- 第六章——根据执行计划优化性能(3)——键值查找
- 第六章——根据执行计划优化性能(1)——理解哈希、合并、嵌套循环连接策略
- Hadoop-impala十大优化之(4)—根据执行计划进行性能优化及最佳实践
- Hadoop-impala十大优化之(4)—根据执行计划进行性能优化及最佳实践
- Oracle 执行计划(5)—cost成本之索引范围扫描-B树索引
- 【性能优化案例】执行计划宁可走全表扫描,也不走索引
- 执行计划---索引扫描
- SQL优化(SQL TUNING)可大幅提升性能的实战技巧之一——让计划沿着索引跑
- Oracle优化——LIKE与索引(以%开头的LIKE会不走索引或走索引全扫描)
- 数据库性能优化——索引
- 视图性能优化——索引视图
- 系统性能优化总结—数据库索引
- 系统性能优化总结—数据库索引
- 执行计划-数据访问方式(全表扫描与4种索引的方式)
- MySql优化2——索引与性能分析
- 数据库查询性能优化之利器—索引(一)
- 数据库查询性能优化之利器—索引(二)
- awk
- open,lseek,read,write,close系统调用《unix环境高级编程读书笔记》(1)
- iOS 6编程实战
- 在ubuntu terminal(终端)的命令提示行 隐藏/显示 当前工作目录
- mysql索引的傻瓜教程
- 第六章——根据执行计划优化性能(2)——查找表/索引扫描
- 【小蒙淘金】3.18晚评-今日高开低走,金银何去何从?
- 图片切换(5屏)
- 每个程序员都应读的书
- 编程之美-2.7最大公约数问题java解法
- 用DISTINCT过滤mysql数据库中重复的字段
- Java最小堆解决TopK问题
- VS2008远程调试
- 数据库范式——通俗易懂【转】