in与exist , not in与not exist 的区别(转)

in和exists 
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。 
如果查询的两个表大小相当,那么用in和exists差别不大。 
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B) 
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc) 
效率高,用到了B表上cc列的索引。 
相反的2:select * from B where cc in (select cc from A) 
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc) 
效率低,用到了A表上cc列的索引。 
 
 
not in 和not exists 
 
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。 
 
  
 
not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG: 
 
请看下面的例子: 
create table t1 (c1 number,c2 number); 
create table t2 (c1 number,c2 number); 
 
insert into t1 values (1,2); 
insert into t1 values (1,3); 
insert into t2 values (1,2); 
insert into t2 values (1,null); 
 
select * from t1 where c2 not in (select c2 from t2); 
no rows found 
select * from t1 where not exists (select 1 from t2 where t1.c2=t2.c2); 
c1 c2 
1 3 
 
正如所看到的,not in 出现了不期望的结果集,存在逻辑错误。如果看一下上述两个select语句的执行计划,也会不同。后者使用了hash_aj。 
因此,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录,正如上面例子所示。 
除非子查询字段有非空限制,这时可以使用not in ,并且也可以通过提示让它使用hasg_aj或merge_aj连接

http://blog.csdn.net/liuxilil/article/details/6718409

时间: 2024-11-06 03:44:19

in与exist , not in与not exist 的区别(转)的相关文章

Error resolving template [xxx], template might not exist or might not be exist

Springboot+thymeleaf+mybatis 抛Error resolving template [xxx], template might not exist的异常 原因是我们在pom.xml增加的以下内容导致的,以下内容中src/main/resources这项中没有把你的html文件包括进去,懒一点的做法(<include>**/*.*</include>), <resources> <resource> <targetPath>

sql语句中in与exist not in与not exist 的区别

in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个表大小相当,那么用in和exists差别不大. 全文: in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个表大小相当,那么用in和exists差别不大

in与exist , not in与not exist 的区别

in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询. 一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个表大小相当,那么用in和exists差别不大. 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引:

DOS/BAT批处理if exist else 语句的几种用法

在DOS批处理命令中常常会通过if语句来进行判断来执行下面的命令, 那么批处理if语句怎么用呢,下面学无忧小编就来说说有关批处理if以及if exist else语句的相关内容.一.批处理if书写格式if 条件表达式 (语句1) else (语句2),它的含义是:如果条件表达式成立,那么,就执行语句1,否则,将执行语句2.二.四种批处理if的用法1.判断驱动器.文件或文件夹是否存在,用 if exist 语句例如:if exist c:\xue51com.txt (echo c盘下有xue51c

点分治练习: boatherds

[题面] 求一颗树上距离为K的点对是否存在 输入数据 n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行每行询问一个K 输出数据 对于每个K每行输出一个答案,存在输出“AYE”,否则输出”NAY”(不包含引号) 数据范围 对于30%的数据n<=100 对于60%的数据n<=1000,m<=50 对于100%的数据n<=10000,m<=100,c<=1000,K<=10000000 [思路] 树分治. 离线存储m个询问.分治判断该m个询问

Python聊天室

1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端. 2.知识点 服务器端涉及到asyncore.asynchat和socket这几个模块,客户端用到了telnetlib.wx.time和thread这几个模块. 二.项目实战(服务器端) 1.服务器类 首先需要一个聊天服务器,这里继承asyncore的dispatcher类来实现,代码如下 class ChatServer(dispatcher): """ 聊天服务器 """ def _

javaWeb校园宿舍管理解析(二)

上一章我们已经集成struts2,本章我们主要将mybatis集成进来,方便我们持久层代码的编写. 首先添加相应的包:mybatis-3.1.1.jar,oracle驱动包:ojdbc14.jar 创建管理员用户存储表,用来查询登录页选择管理员的用户,数据稍后再插入. CREATE TABLE admin(  Admin_ID number(11), Admin_Username varchar(20), Admin_Password varchar(20), Admin_Name varcha

Ajax简单用户的注册验证

Ajax的核心是XMLHttpRequest对象 所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject).XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 例如:通过Ajax的异步刷新简单验证用户名的可用性 前端JSP页面代码: <%@ page language="java" contentType="text/html; charse

shell 脚本-符号-基础语法

为了便于识别  建议 以.sh 结尾 shell脚本 可以放上所有的命令行的指令(源于bash) shell脚本 是 解释型语言      c/c++ 是编译型语言 下面用到的 shell代码sh_1.sh #!/bin/bash cd ../ ls pwd 解释型脚本的执行过程: script.sh 是文本文件,根本没有代码段和 _start  函数 , exec 怎么执行. 解释: Shell会fork 一个子进程并调用 exec执行 ./script.sh这个程序,exec 系统调用应该把