为什么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语句优化案例相关推荐

  1. sql语句优化总结 mysql_MySQL-SQL优化总结

    转载: https://blog.csdn.net/qq_39390545/article/details/107020686 理解SQL优化原理 ,首先要搞清楚SQL执行顺序: SELECT语句 - ...

  2. sql查询索引语句_sql优化总结--基于sql语句优化和索引优化

    概述 最近做查询,统计和汇总.由于数据量比较庞大,大部分表数据上百万,甚至有的表数据上千万.所以在系统中做sql优化比较多,特此写一篇文章总结一下关于sql优化方面的经验. 导致查询缓慢的原因 1.数 ...

  3. SQL Server 2000优化SELECT语句方法

    本文是SQL Server SQL语句优化系列文章的第一篇.该系列文章描述了在Micosoft's SQLServer2000关系数据库管理系统中优化SELECT语句的基本技巧,我们讨论的技巧可在Mi ...

  4. sql declare用法_SQL语句的优化分析

    一.开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应 ...

  5. MySQL数据库---SQL语句优化及性能优化

    文章目录 mysql的架构图 mysql的执行过程 sql语句执行计划 索引失效的情况 mysql性能调优: 分库分表 读写分离---主从复制 mysql的架构图 大致分为4层:连接层.服务层.引擎层 ...

  6. SQL优化—— 优化insert语句

    优化insert语句

  7. sql的不等于条件优化_SQL优化案例(2):OR条件优化

    随后上一篇文章< SQL优化案例(1):隐式转换>的介绍,此处内容围绕OR的优化展开. 在MySQL中,同样的查询条件,如果变换OR在SQL语句中的位置,那么查询的结果也会有差异,在多个复 ...

  8. 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(优化TUNING)技术精髓之——执行计划获取及理解

    <高性能SQL调优精要与案例解析>中,主要以Oracle为样本讲解了SQL调优(优化&TUNING),其中,前面博文中本人也说到,就SQL调优的思路.方法和步骤来说,各关系库几乎是 ...

  9. mysql语句优化百条_优化mysql语句

    1.查询SQL尽量不要使用select *,而是select具体字段. 反例子:select * from employee; 正例子:select id,name from employee; 理由 ...

  10. MySQL优化索引及优化汉字模糊查询语句

    转 http://blog.csdn.net/firstboy0513/article/details/6912632 利用MySQL这种关系型数据库来做索引,的确有些勉强了,也只能看情况来说了,有些 ...

最新文章

  1. 概述自动机器学习(AutoML)
  2. 6万车主使用智能驾驶不给钱,理想汽车竟然还说越多越好?
  3. python类库丰富吗_Rich库:丰富你的Python程序终端输出
  4. SpringBootStarter种类
  5. dbgrid的最小高度设置。否则出现滚动条。
  6. I've got so many hongbaos(should it be translated as red bags?)
  7. python2与python3共存_【python】--python2与python3 共存
  8. linux svn权限如何打开文件,如何让 SVN 或者 GIT 保留 Linux 文件权限
  9. 后端技术:Java 程序员常犯的 10 个 SQL 错误!
  10. C#网络编程示例(note)
  11. Android 应用程序获得系统权限
  12. 第四次作业(1、2小题)
  13. 自考 软件工程专业 07028 软件测试 总结
  14. 视觉三维重建核心算法讲解和代码实现(sfm构建稀疏地图和mvs构建稠密地图)...
  15. ESL-chapter6 核密度估计和分类
  16. 赛科尔亚洲招聘Axapta顾问
  17. 玩转Oracle服务器连接
  18. 总结:参加第二届网络信息服务国际学术会议有感
  19. 《吴军:科技史纲60讲》走近科技文明世界
  20. Windows 使用 FluentTerminal 搭配 Oh-My-Posh

热门文章

  1. html5的canvas元素使用,HTML5canvas元素概念及使用方法介绍
  2. 商业模式新生代_业务分析基础 - 商业模式新生代01篇
  3. visual studio 2015 配置好qt5后, 第一次运行出现 无法打开源文件“QtWidgets/QApplication”和无法运行rc.exe的解决方案
  4. 私人博客定制---服务器接口封装
  5. HYSBZ - 1101——莫比乌斯反演
  6. C++ template —— 动多态与静多态(六)
  7. linux网络编程(二)高并发服务器
  8. 真香警告!2021Android高级面试题,挥泪整理面经
  9. 第五周课程总结实验报告(三)
  10. MEF初体验之九:部件生命周期