SQL查询性能分析之(not in)、(and not)、()、(!=)性能比较
SQL查询性能分析之(not in)、(and not)、()、(!=)性能比较
<: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)、()、(!=)性能比较的更多相关文章
- CSS性能分析,如何优化CSS提高性能
不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...
- HashMap 中7种遍历方式的性能分析
随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...
- APP 性能分析工作台——你的最佳桌面端性能分析助手
目前 MARS-App 性能分析工作台版本为开发者提供Fastbot桌面版的服务. 旨在帮助开发者们更快.更便捷地开启智能测试之旅,成倍提升稳定性测试的效率. 作者:字节跳动终端技术--王凯 背景 F ...
- HashMap 的 7 种遍历方式与性能分析
前言 随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从 ...
- 正确使用Android性能分析工具——TraceView
http://blog.jobbole.com/78995/ 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 - 首页 最新文章 IT 职场 前端 - Ja ...
- Cocos2d-x性能分析-Android版本之Gprof
在 iOS 平台下我们可以用 Xcode 自带的 Profile 工具来测试我们程序的性能,Android 平台使用的 gprof 这里整理了一下具体的cocos2dx 使用gprof进行性能分析的具 ...
- Linux 性能分析工具汇总合集
出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...
- [转]Linux性能分析工具汇总合集
出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...
- 超全整理!Linux性能分析工具汇总合集
转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...
- 性能分析工具gprof介绍(转载)
性能分析工具gprof介绍Ver:1.0 目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profil ...
随机推荐
- OCI-DML-更新数据库中不存在的字段
用gtest来测试oracle中oci方式的SQL语句操作,在测试update数据库中不存在的异常案例的时候,日志没有报错,但是结束后跳出了数据库连接 gtest也没有给出正常的结果,本身update ...
- vim 跳转命令
基本跳转: hjkl:左下上右 HML:当前屏幕顶.中.底部 web:下一单词词首.下一单词词尾.前一单词词首 gg:文件首 G:文件末尾 ngg/nG:第n行 ta:移动到所在行之后第一个字符a ...
- 执行插入语句时直接返回插入信息的自增id,判断是否为空
insert into userinfo(UserName,UserPass,RegTime,email)values('a','b',GETDATE(),'123@qq.com');select @ ...
- 操作xml文档的常用方式
1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...
- 51nod1417 天堂里的游戏
---恢复内容开始--- 1417 天堂里的游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 多年后,每当Noder看到吉普赛人,就会想起那个遥 ...
- IP HELPER GetAdaptersAddresses 函数
自己做的一些笔记,XP以及以后的系统使用: MSDN 函数:http://msdn.microsoft.com/en-US/library/windows/desktop/aa365915(v=vs. ...
- PythonCrawl自学日志(3)
2016年9月21日09:21:431.爬虫的抓取周期:(1)首先生成初始请求爬第一个url,并指定一个回调函数被称为与下载这些请求的响应.(2)第一个请求执行通过调用 start_requests( ...
- FatMouse
时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1431 解决:641 题目描述: FatMouse prepared M pounds of cat food, ready to t ...
- 约束的DEFERRABLE, NOT DEFERRABLE, INITIALLY IMMEDIATE 和 INITIALLY DEFERRED
[ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) [ NO INHERIT ] | DEFAU ...
- WinForm 控件库
1:Telerik 介绍: Telerik 是保加利亚的一个软件公司,专注于微软.Net平台的表示层与内容管理控件.Telerik 提供高度稳定性和丰富性能的组件产品,并可应用在非常严格的环境中. 现 ...