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 ...
随机推荐
- Windows内存管理[转]
本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...
- Wildfly8 更改response header中的Server参数
项目经过局方安全检查需要屏蔽掉服务器中间件信息,查了一下午,网上看到的都是修改jboss7的,我们使用的wildfly8(jboss改名为wildfly),修改地方不一样,折磨了半天. jboss服务 ...
- asp.net 中使用less
首先 ,需要知道 whats the less; 实际上less 只是针对css比较难于维护和抽象这种现象,而创造的一个工具. 然后,在抛开语言环境的情况下(例如.net 是vs环境,java是ecl ...
- MySql中,复制旧表结构到新表
# 创建学生表 create table student(age int,name varchar(32))engine myisam charset utf8;insert into student ...
- 自己写的一个分页控件类(WinForm)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...
- 编写高性能 Web 应用程序的 10 个技巧
使用 ASP.NET 编写 Web 应用程序的简单程度令人不敢相信.正因为如此简单,所以很多开发人员就不会花时间来设计其应用程序的结构,以获得更好的性能了.在本文中,我将讲述 10 个用于编写高性能 ...
- 基于api安全性的解决处理方案
api解决用户安全主要采用两种方案: 一.使用token识别用户信息,作为识别用户的凭证 1.为什么使用token? 常规性的pc站点,使用session存储用户登录状态. 即用户登录之后,服务端会生 ...
- PHP基础入门教程 PHP循环函数
PHP循环主要有四种:while,do…while,for,foreach.下面我们分开讲解每种循环的用法. while语句: 只要指定的条件成立,则循环执行代码块. 格式: while(expr) ...
- tortoiseGit的SHH秘钥设置
tortoiseGit如果安装时使用默认的putty方式,因为putty的秘钥格式和SSH的不一样,所以要使用自带的工具重新生成一次秘钥. 具体的方式是:用puttyGen工具来生成公钥和秘钥,公钥( ...
- 装tortoiseSVN时遇到的坑
今天给新电脑配置开发环境,线上SVN地址申请权限以后,在本地装了tortoiseSVN,可是安装了以后死活打不开.明明浏览器里可以打开SVN地址,但是tortoiseSVN的浏览器里却打不开,摆弄了很 ...