SQL优化之 not in
来源:互联网 发布:nothing to lose知乎 编辑:程序博客网 时间:2024/05/16 13:52
not in
select * from dic_region_old a where a.region_code not in (select b.region_code from dic_region b)
PL/SQL 执行 选择17 行 耗时14.312秒
用外连接和is null
select a.* from dic_region_old a,dic_region b
where a.region_code = b.region_code(+)
and b.region_code is null
PL/SQL 执行 选择17 行 耗时0.031~0.047秒
用 not exist
select * from dic_region_old a
where not EXISTS
(select b.* from dic_region b
where a.region_code = b.region_code)
PL/SQL 执行 选择17 行 耗时0.031~0.047秒
如果有其它限制条件 只能 用 not exist
下面是转载内容
发表于: 2005.01.06 14:50
分类: 数据库优化
出处: http://.itpub.net/post/306/12926
---------------------------------------------------------------
用外连接和is null优化not in的限制条件
今天帮同事优化一个SQL语句
select *
from tbl_st1000_embedlist
where to_char(ACCDATE,'yyyy.mm.dd')='2005.01.01' and
sublog_id not in
( select sublog_id
from tbl_embedlist
where to_char(ACCDATE,'yyyy.mm.dd')='2005.01.01'
)
上面的SQL语句查询到有很多记录。
我开始觉得很简单,这不就是用外连接和is null优化not in的SQL语句吗,
于是我写成下面的结果
select a.*
from tbl_st1000_embedlist a, tbl_embedlist b
where a.sublog_id = b.sublog_id(+)
and to_char(a.ACCDATE,'yyyy.mm.dd')='2005.01.01'
and to_char(b.ACCDATE,'yyyy.mm.dd')='2005.01.01'
and b.sublog_id is null;
但是一条记录也没有得到,后来我修改了SQL语句,用not exists替换not in
select *
from tbl_st1000_embedlist a
where to_char(ACCDATE,'yyyy.mm.dd')='2005.01.01'
and not exists
( select 'X'
from tbl_embedlist
where to_char(ACCDATE,'yyyy.mm.dd')='2005.01.01'
and sublog_id = a.sublog_id
)
这样才得到正确的结果。
我分析了一下,如果没有其他的限制条件,用外连接和is null可以优化not in的SQL语句,但是如果有了其他的限制条件
就不能这样用了。
原因如下:用外连接和is null替换not in的SQL语句,例如 a not in b ,可以理解为从A找不在B的记录,
如果在增加了其他的限制条件,这些其他的限制条件就会和外连接联合起作用,把is null这个限制条件理解为某个字段为空,而不是没有这样的记录了
- SQL优化之 not in
- sql优化not in
- spark-sql not in 优化
- SQL查询性能优化 之 LEFT JOIN 替换 NOT IN
- sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句
- Sql语句优化之用exists、not exists替代in、not in
- SQL语句中的NOT IN 的优化
- 【SQL优化】不要使用not in
- 优化SQL语句:in 和not in的替代方案
- sql查询优化,项目中遇到的not in优化
- 数据库优化技巧之in和not in
- sql语句优化:用join取代not in
- sql语句优化:用join取代not in
- sql语句优化--用EXISTS替代IN、用NOT EXISTS替代NOT IN
- SQL语句优化—in,not in,exists,not exists, left join...on
- sql优化,in与exist , not in与not exist 的区别
- SQL优化之-In和Exists
- sql简单优化之in字句
- AJAX入门
- 解决VISTA下安装VS 2005需要先安装XP SP2的问题
- Windows 2000/XP/2003 下 IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin安装配置
- ajax readyState
- 身体器官工作表一览
- SQL优化之 not in
- ant学习笔记(四)
- ORACLE UTL_FILE文件包的应用,文件I/O操作
- 字符串分割函数:类似于VB的split()函数
- 网民出“邪招”应对运营商封堵
- 完整的ORACLE的UTL_FILE的资料
- .NET开发中的一些小技巧!(摘抄)
- Oracle内建包UTL_FILE使用说明
- JasperReport报表设计总结