SQL 语句优化--IN语句优化案例
为什么80%的码农都做不了架构师?>>>
今天客户系统升级,通过DMVs性能分析查了一下,升级后发现一个语句执行时间比较长,执行语句要好几秒钟,调出语句如下:
select distinct field003 from ufi2j0n11179717502375 where
field003 not in ('','40288135120d660501120de2f8870140','40288135120d660501120de4b9ee014b',
'40288135120d660501120de9c3ba016c','40288135120d660501120df0460c01b2','40288135120d660501120df1dc2d01d3') and requestid in(select requestid from ufi8s6u81179717475734 where field001 in (select requestid from uft3a6h61176948132312 where field066 is not null and field197 between convert(datetime, '2008-08-16') and convert(datetime,'2008-09-15')) )
后来看了一下,这几表的数据
-- 表 dbo.uft3a6h61176948132312 : 988行
-- 表:dbo.ufi2j0n11179717502375 :713行
-- 表: dbo.ufi8s6u81179717475734 : 273行
发现这三张表都没有超过1千行数据,建立索引意义不大,为何如此慢,看看执行计划:
分析:发现是表dbo.uft3a6h61176948132312 访问开销最大,但表中数据不到一千行。执行看看结果:
(5 行受影响)
表 'uft3a6h61176948132312'。扫描计数 1,逻辑读取 27161 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'ufi8s6u81179717475734'。扫描计数 1,逻辑读取 37 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'ufi2j0n11179717502375'。扫描计数 1,逻辑读取 46 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
这里发现表uft3a6h61176948132312的访问有近3万次IO。 一开始以为是in的缘故,将in换成exists结果也是一样,这时考虑用inner join来重新写sql语句,语句如下:
select distinct a.field003 from ufi2j0n11179717502375 a
inner join ufi8s6u81179717475734 b on a.requestid=b.requestid
inner join uft3a6h61176948132312 c on b.field001=c.requestid
where a.field003 not in ('','40288135120d660501120de2f8870140','40288135120d660501120de4b9ee014b','40288135120d660501120de9c3ba016c','40288135120d660501120df0460c01b2','40288135120d660501120df1dc2d01d3') and c.field066 is not null and c.field197 between
convert(datetime, '2008-08-16') and convert(datetime,'2008-09-15')
查看执行计划:
分析:这时发现执行计划发生了变化,最外层的表变成了dbo.ufi2j0n11179717502375,执行结果如下:
(5 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'ufi2j0n11179717502375'。扫描计数 1,逻辑读取 46 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'ufi8s6u81179717475734'。扫描计数 1,逻辑读取 37 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'uft3a6h61176948132312'。扫描计数 1,逻辑读取 421 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
这时发现整个IO次数比先前少了很多。
总结:
根据这两个执行计划分析,sql server 2005优化器对于in语句没有正确选择联结算法,错误的采用了采用了”嵌套循环算法“。
根据嵌套循环算法IO次数:421*(其他两个表的关联匹配行数)≈27163次 (访问表“uft3a6h61176948132312”IO次数),而这时由于返回的行数比较多,又没有建立索引,这时最佳的算法是使用“hash联结算法“
转载于:https://my.oschina.net/ldm95/blog/745893
SQL 语句优化--IN语句优化案例相关推荐
- sql语句优化总结 mysql_MySQL-SQL优化总结
转载: https://blog.csdn.net/qq_39390545/article/details/107020686 理解SQL优化原理 ,首先要搞清楚SQL执行顺序: SELECT语句 - ...
- sql查询索引语句_sql优化总结--基于sql语句优化和索引优化
概述 最近做查询,统计和汇总.由于数据量比较庞大,大部分表数据上百万,甚至有的表数据上千万.所以在系统中做sql优化比较多,特此写一篇文章总结一下关于sql优化方面的经验. 导致查询缓慢的原因 1.数 ...
- SQL Server 2000优化SELECT语句方法
本文是SQL Server SQL语句优化系列文章的第一篇.该系列文章描述了在Micosoft's SQLServer2000关系数据库管理系统中优化SELECT语句的基本技巧,我们讨论的技巧可在Mi ...
- sql declare用法_SQL语句的优化分析
一.开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应 ...
- MySQL数据库---SQL语句优化及性能优化
文章目录 mysql的架构图 mysql的执行过程 sql语句执行计划 索引失效的情况 mysql性能调优: 分库分表 读写分离---主从复制 mysql的架构图 大致分为4层:连接层.服务层.引擎层 ...
- SQL优化—— 优化insert语句
优化insert语句
- sql的不等于条件优化_SQL优化案例(2):OR条件优化
随后上一篇文章< SQL优化案例(1):隐式转换>的介绍,此处内容围绕OR的优化展开. 在MySQL中,同样的查询条件,如果变换OR在SQL语句中的位置,那么查询的结果也会有差异,在多个复 ...
- 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(优化TUNING)技术精髓之——执行计划获取及理解
<高性能SQL调优精要与案例解析>中,主要以Oracle为样本讲解了SQL调优(优化&TUNING),其中,前面博文中本人也说到,就SQL调优的思路.方法和步骤来说,各关系库几乎是 ...
- mysql语句优化百条_优化mysql语句
1.查询SQL尽量不要使用select *,而是select具体字段. 反例子:select * from employee; 正例子:select id,name from employee; 理由 ...
- MySQL优化索引及优化汉字模糊查询语句
转 http://blog.csdn.net/firstboy0513/article/details/6912632 利用MySQL这种关系型数据库来做索引,的确有些勉强了,也只能看情况来说了,有些 ...
最新文章
- 概述自动机器学习(AutoML)
- 6万车主使用智能驾驶不给钱,理想汽车竟然还说越多越好?
- python类库丰富吗_Rich库:丰富你的Python程序终端输出
- SpringBootStarter种类
- dbgrid的最小高度设置。否则出现滚动条。
- I've got so many hongbaos(should it be translated as red bags?)
- python2与python3共存_【python】--python2与python3 共存
- linux svn权限如何打开文件,如何让 SVN 或者 GIT 保留 Linux 文件权限
- 后端技术:Java 程序员常犯的 10 个 SQL 错误!
- C#网络编程示例(note)
- Android 应用程序获得系统权限
- 第四次作业(1、2小题)
- 自考 软件工程专业 07028 软件测试 总结
- 视觉三维重建核心算法讲解和代码实现(sfm构建稀疏地图和mvs构建稠密地图)...
- ESL-chapter6 核密度估计和分类
- 赛科尔亚洲招聘Axapta顾问
- 玩转Oracle服务器连接
- 总结:参加第二届网络信息服务国际学术会议有感
- 《吴军:科技史纲60讲》走近科技文明世界
- Windows 使用 FluentTerminal 搭配 Oh-My-Posh
热门文章
- html5的canvas元素使用,HTML5canvas元素概念及使用方法介绍
- 商业模式新生代_业务分析基础 - 商业模式新生代01篇
- visual studio 2015 配置好qt5后, 第一次运行出现 无法打开源文件“QtWidgets/QApplication”和无法运行rc.exe的解决方案
- 私人博客定制---服务器接口封装
- HYSBZ - 1101——莫比乌斯反演
- C++ template —— 动多态与静多态(六)
- linux网络编程(二)高并发服务器
- 真香警告!2021Android高级面试题,挥泪整理面经
- 第五周课程总结实验报告(三)
- MEF初体验之九:部件生命周期