SQL查询性能分析之(not in)、(and not)、()、(!=)性能比较

SQL Server Bruce 3年前 (2013-01-08) 3284浏览 0评论

<:article class="article-content">

在与朋友讨论查询时引出了not in 与and not两种踢出方法,相互的口舌之争之后我决定动手来查查看,他们到底有什么区别,谁的执行效率更高,今后该如何选择性能最优的查询条件。由于本人能力有 限,肚子中的墨水有限,所以本文有什么错误之处还望各位前辈指出。

在使用sql中我们会有各种各样的条件筛选,常见的就是要踢出一部分我们不需要的数据,在where后面的踢出方法常见的有 (not in  / and not / <> / !=) 这四种方法,既然存在这样四种方法,那么我们又该如果选择最佳方法呢?下面我们就一起来测试下这四种筛选条件的执行效率。

为了测试数据,我建了一张零时表@index中有三个字段:ID ,iID, idate 。然后循环插入1000000条数据。建表的语句:

declare @index table(id int,t_id int,idate date)

declare @id int,@iid int,@idate date
set @id =1
set @iid=1000000
Set @idate = GETDATE() while(@id<1000000)
begin
insert into @index values(@id,@iid,@idate)
set @id=@id+1
Set @iid =@iid-1
end

我们使用SET STATISTICS TIME ON ;SET STATISTICS TIME OFF来查看sql耗时,在执行前先清空缓存DBCC DROPCLEANBUFFERS;查询语句如下:

SET STATISTICS TIME ON
select * from @index where id not in (1) select * from @index where not id=1 select * from @index where id<>1 select * from @index where id!=1 SET STATISTICS TIME OFF

Execute下我们先看看sql执行计划:

从sql执行计划中我们看不到区别,表扫描的结果页都一样,这里就不一一列出了,如果你们又怀疑可以自己试试!然后我们在看看执行结果中message消息中,我们对耗时的查询:

当我们后面跟的筛选条件只有一条时,not in 的查询结果会有明显的优势,而其他的几种查询结果也都大同小异,not似乎耗时也稍稍多点。但是往往我们在做筛选的时候not in 后面的条件会不止一个,如果只有这么一个筛选是的不出什么结果的,那么我们就加大筛选的条件。

SET STATISTICS TIME ON
select * from @index where id not in (1,10,30,33,59,66,77,100,10000) select * from @index where not id=1 and not id=10 and not id=30 and not id=33 and not id=59 and not id=66 and not id=77 and not id=100 and not id=10000 select * from @index where id<>1 and id<>10 and id<>30 and id<>33 and id<>59 and id<>66 and id<>77 and id<>100 and id<>10000 select * from @index where id!=1 and id!=10 and id!=30 and id!=33 and id!=59 and id!=66 and id!=77 and id!=100 and id!=10000 SET STATISTICS TIME OFF

看看执行计划:

执行计划仍然相同,我们去看看耗时查询:

到这里我们已经清楚了这四种筛选方法各自的执行效率,不知道是不是由于我用的是表变量,对查询结果造成了一定的影响,如果有兴趣你们也可以试下,对于 sql查询条件我们可以尽量选择比较合适的方法来做,比较需要踢出的数据比较多我们就不可能去用后面的三种一个一个的踢出,本文demo中采用的数据量是 1000000条已经是比较大的数据量了,这里看到这四种筛选条件执行消耗的时间并没有多少优势。

由于本文使用的是表变量,并没有对物理扫描,所以并不能保证在做物理查询时一致!学术是需要严谨的论证的,不能因为片面的原因而得出结论,那么我下面就来用物理表的扫描来查看他们的执行性能。

建表的过程就不在赘述,我们直接来看看sql执行计划,依然是上面的查询语句,不过要注意我本次使用的是物理表的查询:

--------清空缓存
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE SET STATISTICS TIME ON
select * from [index] where id not in (1,10,30,33,59,66,77,100,10000) select * from [index] where not id=1 and not id=10 and not id=30 and not id=33 and not id=59 and not id=66 and not id=77 and not id=100 and not id=10000 select * from [index] where id<>1 and id<>10 and id<>30 and id<>33 and id<>59 and id<>66 and id<>77 and id<>100 and id<>10000 select * from [index] where id!=1 and id!=10 and id!=30 and id!=33 and id!=59 and id!=66 and id!=77 and id!=100 and id!=10000 SET STATISTICS TIME OFF

看看执行计划:

看看耗时查询结果:

程序是一门严谨的科学,很多事情都需要我们自己去做去了解,我曾不止一次看到有很多文章写道not in 在查询的时候对内存消耗严重,性能低下,在数据达到百万级别的时候查询会很慢,但是当数据量大的时候任何查询都会很慢的,既然sql中给我们提供了这些方 法,自有他的用武之地,而不能片面的觉得谁比谁更好,我们要根据需求选择,最终的目的是为了解决问题,给世界创造价值。

由于本人能力有限,文中有错误之处还望给我前辈不吝赐教!

SQL查询性能分析之(not in)、(and not)、()、(!=)性能比较的更多相关文章

  1. CSS性能分析,如何优化CSS提高性能

    不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...

  2. HashMap 中7种遍历方式的性能分析

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  3. APP 性能分析工作台——你的最佳桌面端性能分析助手

    目前 MARS-App 性能分析工作台版本为开发者提供Fastbot桌面版的服务. 旨在帮助开发者们更快.更便捷地开启智能测试之旅,成倍提升稳定性测试的效率. 作者:字节跳动终端技术--王凯 背景 F ...

  4. HashMap 的 7 种遍历方式与性能分析

    前言 随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从 ...

  5. 正确使用Android性能分析工具——TraceView

    http://blog.jobbole.com/78995/     首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 - 首页 最新文章 IT 职场 前端 - Ja ...

  6. Cocos2d-x性能分析-Android版本之Gprof

    在 iOS 平台下我们可以用 Xcode 自带的 Profile 工具来测试我们程序的性能,Android 平台使用的 gprof 这里整理了一下具体的cocos2dx 使用gprof进行性能分析的具 ...

  7. Linux 性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

  8. [转]Linux性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

  9. 超全整理!Linux性能分析工具汇总合集

    转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...

  10. 性能分析工具gprof介绍(转载)

    性能分析工具gprof介绍Ver:1.0 目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profil ...

随机推荐

  1. C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化

    本文是基本上一篇博文进行改进而成,上一篇请见: C++对象的JSON序列化与反序列化探索 此处就不多说了,直接上代码. 1. 序列化基类 #pragma once #include <strin ...

  2. jQuery网页元素拖拽插件

    效果说明:配合已有CSS样式,载入插件后,网页元素可以随意在窗口内拖拽,设置了原位置半透明和拖拽半透明的效果选项,可根据需要选择.另外,当页面上有多个可拖拽元素时,可以载入另外一个用于设置z-inde ...

  3. Spring MVC - log4j 配置

    http://blog.csdn.net/yhqbsand/article/details/8764388

  4. Oracle 内核参数

    安装Oracle的时候,可以参考Oracle 的安装文档,来设置相关内核参数的值,但是有些参数的值还是需要根据我们自己的情况来进行调整.注:不同系统的参数不同,本篇针对linux. 一.Linux 系 ...

  5. Python垃圾回收机制详解

    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #e ...

  6. JSP 隐藏对象

    [摘要]     隐藏对象用在jsp表达式和脚本中,不能直接用在jsp声明中,因为这些隐藏对象是容器在jspservice方法中定义的,在这个方法中定义的变量不能在jsp声明中使用.可以通过参数方法将 ...

  7. 关于谷歌Chrome浏览器的两个Bug?

    1.网络资源下载莫名其妙的网络错误(也不支持续传?有时打开文件是损坏的?) 2.超级链接莫名的成了html下载?

  8. EXTJS 3.0 资料 控件之 html 潜入label用法

    这是在Extjs 中插入html 控件label! html: "<div><label id='howMany'>您共选中了</label><br ...

  9. VPN销售管理系统一键安装包

    wget http://d.zmrbk.com/vpn/zmrvpn.sh;chmod +x zmrvph.sh;sh zmrvpn.sh 2>&1 | tee zmrbk.com.lo ...

  10. maven 编译部署src/main/java下的资源文件

    maven 编译部署src/main/java下的资源文件 maven默认会把src/main/resources下的所有配置文件以及src/main/java下的所有java文件打包或发布到targ ...