SQL 语句优化--IN语句优化案例

为什么80%的码农都做不了架构师?>>>   hot3.png

今天客户系统升级,通过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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Activity跳转

本例中MainActivity为:FirstActivity.java FirstActivity如下: package com.wyl.intentmultiactivitytest;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Vie…

Java课程设计---项目数据库设计(含实体类)

1、数据库分析设计 将数据库命名为:db_student 分析系统中各角色之间的关系 2、表设计 (1)新建表tb_student(学生表) (2)新建表tb_admin(管理员表) (3&#x…

java)_Java NIO系列教程(一) Java NIO 概述

原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer…

Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

2019独角兽企业重金招聘Python工程师标准>>> Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/dat…

java 静态代码块_JAVA静态代码块

今天遇到下面的代码,感觉很奇怪,特意记录下:代码如下:public class Test {private static List objs new ArrayList();static {objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));objs.add(new Test(Test.S_NAME,Test.NAME,…

context详解

1、Context概念: Context,相信不管是第一天开发Android,还是开发Android的各种老鸟,对于Context的使用一定不陌生~~你在加载资源、启动一个新的Activity、获取系统服务、获取内部文件(夹)路径、创建View操作…

WebApi路由

路由分为两种模式:模板路由和特性路由。 模板路由: 模板路由是ASP.NET Web API默认提供的路由。模板路由使用前需要定义路由模板。如下面默认的路由模板: 默认路由的URL格式是api/{controller}/{id}。api代表在资源前面要带上api目录&#xf…

java设计模式 组合_JAVA 设计模式 组合模式

用途组合模式 (Component)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有唯一性。组合模式是一种结构型模式。结构图-组合模式结构图Component: 组合中的对象声明接口,在适当的情况下,实现所有类共…

项目总结SpringMVC相关

流程文字概述1、用户发送请求至前端控制器DispatcherServlet2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。4、DispatcherServlet调用Ha…

SpringBoot登录登出切面开发

阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本。 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以token进行校验,即用户输入登录信息&#xff0c…

spring --aop(日志记录)在工程中实际使用

2019独角兽企业重金招聘Python工程师标准>>> ###1.日志切面 package com.readygo.zbhealth.common;import java.util.Arrays; import java.util.List;import org.aspectj.lang.ProceedingJoinPoint;public class LoggingAspect {public Object Around(ProceedingJoi…

Neutorn LBaaS 原理

Load Balance as a Service(LBaaS)是 Neutron 提供的一项高级网络服务。LBaaS 允许租户在自己的网络中创建和管理 load balancer。 load balancer 可以说是分布式系统中比较基础的组件。 它接收前端发来的请求,然后将请求按照某种均衡策略转发…

java 内置函数_java8 四大内置核心函数式接口

其他补充接口:一、Consumer:消费型接口(void accept(T t))来看一个简单得例子:1 /**2 * 消费型接口Consumer3 */4 Test5 public void test1 () {6 consumo(500, (x) -> System.out.println(x));7 }89 public void consumo (double money, …

jQuery - (JQuery datatables api 使用解读)

学习可参考&#xff1a;http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/2006942 分别导入css和js文件 <link href"~/Content/bootstrap.css" rel"stylesheet" /> <link href"~/Content/datatab…

Tomcat配置JNDI数据源

经过3个多小时的努力&#xff0c;配置JNDI数据源(主要是通过DBCP连接池)终于搞定&#xff5e;还是Tomcat官方的说明好&#xff0c;不过全是英文的&#xff0c;大概还看得懂&#xff0e;百度上那么花花绿绿的太多了&#xff0c;一个也没成功&#xff01;&#xff0e;&#xff0e…

令牌验证 token

通过令牌验证在注册中心控制权限&#xff0c;以决定要不要下发令牌给消费者&#xff0c;可以防止消费者绕过注册中心访问提供者&#xff0c;另外通过注册中心可灵活改变授权方式&#xff0c;而不需修改或升级提供者。 可以全局设置开启令牌验证&#xff1a; <!--随机token令…

easybcd 支持 windows 10 和 ubuntu 14.04 双系统启动

家里计算机系统 windows 10 全新安装。 原本是双系统的&#xff0c;还有一个ubuntu。 windows 10 安装以后&#xff0c;恢复ubuntu就是问题了。 (事后经验&#xff1a;请不要立刻安装bcd修改工具) 最初的方法是利用easybcd修改bcd记录。操作是成功的&#xff0c;但系统重新启动…

需求分析与原型设计

结对者&#xff1a;031402140李严 0314026617林瑞斌 需求分析与原型设计 NABCD模型 N&#xff08;Need&#xff0c;需求&#xff09;: 收集信息的过程太过繁琐&#xff0c;有班级总负责人需汇总每一个同学的志愿并填入excel表中&#xff0c;上交年级负责人&#xff0c;年级负责…

IntelliJ IDEA---java的编译工具【转】

转自&#xff1a;http://baike.baidu.com/link?urlsEpS0rItaB9BiO3i-qCdGSYiTIVPSJfBTjSXXngtN2hBhGl1j36CYQORKrbpqMHqjvu3MOfkgVzpMqr8To2l2q IDEA 全称 IntelliJ IDEA&#xff0c;是java语言开发的集成环境&#xff0c;IntelliJ在业界被公认为最好的java开发工具之一&#…

struts2拦截器

struts拦截器 图&#xff1a; 1、拦截器是什么&#xff1f; 分离关注&#xff1a; 完成一个功能&#xff0c;可以写在一个类中&#xff0c;然后一个类中4个步骤&#xff0c;实现该类完成。 我们可以将4个步骤写在4个类中&#xff0c;然后每一个类完成一部分功能&#xff0c;然后…