sql语句,实践证明了某种情况下not in的效率高于not exists
只要百度not in和not exists,清一色的not exists的效率优于not in,毕竟not exists只是去强调是否返回结果集,只是一个bool值,而not in是返回一个结果集,是由大量大量数据构成的。所以一开始我在做的时候写的是not in,然后前辈告诉我效率太低,改成了not exists,结果查询速度特别慢。为什么呢?首先来看看sql语句,本身sql语句特别长,只写出where条件中的not in和not exists筛选部分语句。
not in: where substr(表A.字段A,1,9) not in (select substr(字段B,1,9) from 表B) and 表A.字段C not in (select 字段D from 表C)
not exists:where not exists (select 1 from 表B where substr(表B.字段B,1,9) = substr(表A.字段A,1,9) and not exists (select 1 from 表C where 表C.字段D = 表A.字段C)
主表是表A,大概也就不超过10万的数据量吧,然后前面表A先做过一次inner join和两次left join,inner join排除了表A中将近六分之五的数据,两次left join中一次是替换掉表A中的某个字段的值,另一次多取一次值。这些处理都花极其少的时间。然后现在这么做远远不够,表A还要根据另外两张表中的数据来进行再次过滤。这个行为就是通过两个not in来完成的。一开始借鉴了前辈的提议,用了not exists,毕竟返回一个bool值是大量的节省时间,然后实际结果下来却花了整整3秒多,这对于一个用户来是完完全全不能接受的。为什么原因呢?最后推导出原因肯定是在前一句not exists中的两个substr。表B中大概只有5000不到的数据,然而表A里面却有几万条数据,用表B中的每个值和表A中的每个值都要进行一次比较处理,那会是多么一个庞大的处理!!尽管not exists只是返回一个bool值,但是却忽略了里面select语句中where的处理量,而且还要进行一次substr处理。一开始没有想到再去用not in处理,先想到的用的是视图,因为想去除掉一次substr处理,提前把表A中的数据处理好放到视图里,然后再进行处理。结果更加令人意外,视图更加慢,而且还取不到正确结果。这部分的原因我猜应该是表A里面有两个主键,而我做视图的过程中只取了其中一个主键,但是这个取出的这个主键是受后面那个主键约束的,创建了垃圾数据比较多的视图。(其实我本来也不太会视图,还是前辈教的= =。。)我抱着破罐子破摔的想法把not exists换成了not in,然后奇迹出现了,取完整个数据0.1秒一下级别的,反正一眨眼的时间。。完美的符合了系统不管什么处理都不能超过3秒的要求。。
为什么not in在这种情况下效率远远高于not exists呢?按我一介菜鸟的理解,not exists里面的where处理拖慢了整个速度,况且这次处理本来就是想要返回结果集,况且在这之前已经拿了表A.字段A,最终正确的数据是根据这个字段A来获取的,只要拿出不与从其它两张表不匹配的数据即可,就相当于整理衣柜,把没用的衣服拿出来这一个过程而已。而且字段A,B,C,D都是各个表的主键,不存在null值这种概念,没有必要进行额外的判断。所以最后not in的速度比not exists整整快了3秒有余。
数据库是DB2(不要吐槽,日企就是这么喜欢IBM,顶层终于考虑要换oracle。。。)
一介菜鸟,写的错误的地方,欢迎大神提意见,谢谢~~
sql语句,实践证明了某种情况下not in的效率高于not exists的更多相关文章
- sql在外键存在的情况下删除表
SQL Server 批量 停用/启用 外键约束 今天百度知道上面,看到这样一个要求: 现在有一个库,有很多张表想要删除一张表的记录的时候,由于外键关联太多,所以,没法删除相应的记录,谁能帮忙写个存储 ...
- mui Picker DtPicker 固定内容以及变动内容Picker 不同情况下的应用 提高效率
目的是: 保证不同的Picker只创建一次,多次创建Picker系统不会自己销毁,X掉一个之后后面可能会出现下一个. 保证实现需求的情况下,优化代码,提高效率. 1.如果picker中的内容为定值 v ...
- mysql5.6 varchar长度不同的情况下group by的效率
varchar长度短的情况下,基于这个字段的group by效率更高.所以开发在设计表的时候要使该字段在满足业务需求的情况下尽可能的小. ps:本想找源码看看代码那是怎么处理的,直接用vim看文件太累 ...
- 优化sql,返回行数少情况下,NL比hash快好多
sql如下 select t.id, t.value, tt.sort as sortno from ENGINEERING_TYPE t left join ENGINEERING_TYPE tt ...
- Oracle学习中,重点是sql语句的学习,而所有的sql语句都要在scott用户下完成。
熟悉这个用户下的四张表,是必要的. 查看所有表名: SELECT * FROM tab; 查看每张表的结构: DESC 表名称: 1.部门表:dept no 名称 类型 描述 1 DEPTNO NU ...
- SQL&EF优化第一篇 各种情况下的性能测试之count函数篇
测试环境 mssql 08 +win7 数据 30W条 二〇一六年十月二十九日 09:04:43 结论:1>主键> *>可空列 推测未论证: 根据情况优先选择 顺便提 ...
- Sql Server 如何解决多并发情况下,出现的多个相同ID数据
在数据库中单独创建一张表,保存当前存储状态,“存储过程” 设置访问条件root初始值为“0” 如果root值不为0的时候就不可访问并进行相关操作. 在事务执行前将root值设置为1,事务结束后将ro ...
- sql 语句的优化
sql语句的优化:在大多数情况下,为了更快的遍历表结构,优化器主要是根据定义的索引来提高性能.但是在不合理的SQL语句中,优化器会删去索引进而使用全表扫描, 一般而言,这种sql被称为劣质sql,所以 ...
- mysql下sql语句 update 字段=字段+字符串
mysql下sql语句 update 字段=字段+字符串 mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgr ...
随机推荐
- Spark编程进阶
1.累加器 通常在向Spark传递函数时,比如使用map()函数或者用filter()传条件是,可以使用驱动器程序中定义的变量,但是集群中运行的每个人物都会得到这些变量的一份新 ...
- JS 响应式编程
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <script ...
- 段落p元素内的响应式文本布局就靠rem单位实现
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8&qu ...
- PHPcms 把盛大登陆换成人人网登陆
首先要确保你的 phpcms是比较新的版本, v9.3以后的吧 这里说明一个函数 rawurlencode() 本函数将字符串编码成 URL 的字符串专用格式,特殊的字符会转换成百分比符号后面加上二个 ...
- ZOJ-2343-Robbers
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1398 题意: 输入t 有t个测试用例每个测试用例第一行输入三个数n, ...
- MySQL ibdata多路径扩容
vi /etc/my.cnf innodb_data_home_dir = innodb_data_file_path= /data/mysql/ibdata1:10M:autoextend(为目前i ...
- HDFS存储系统
HDFS存储系统 一.基本概念 1.NameNode HDFS采用Master/Slave架构.namenode就是HDFS的Master架构.主要负责HDFS文件系统的管理工作,具体包括:名称空间( ...
- WInform 创建一个简单的WPF应用
(一)创建一个简单的WPF应用 首先,在这里我要说明的是:这里的例子,都是通过控制台程序来创建WPF应用,而非使用现成的WPF模版.因为WPF模版封装了创建WPF应用所需要的各种基本元素,并不利于我们 ...
- HDU5832
A water problem Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- KB奇遇记(5):奇葩的用人制度
8月份入职,公司不给我们正式任命,导致了我们开展工作困难重重,基本上很少有人会鸟你,做事仿佛名不正言不顺.哪怕你是未来信息部的老大也一样,网管们根本不买你的账.所以做ERP选型,做旧OA的选型以及加密 ...