SQL优化之 not in

2023-10-27

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

下面是转载内容

用外连接和is null优化not in的限制条件
===========================================================
作者: 西门吹牛(http://.itpub.net)
发表于: 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这个限制条件理解为某个字段为空,而不是没有这样的记录了


西门吹牛 发表于:2005.01.06 14:50 ::分类: ( 数据库优化 ) ::阅读:(301次) :: 评论 (0)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL优化之 not in 的相关文章

随机推荐

  • 蓝桥杯基础练习所有VIP习题解析代码

    阶乘计算 资源限制 时间限制 1 0s 内存限制 512 0MB 问题描述 输入一个正整数n 输出n 的值 其中n 123 n 算法描述 n 可能很大 而计算机能表示的整数范围有限 需要使用高精度计算的方法 使用一个数组A来表示一个大整数a
  • Mysql 乱码问题--如何查看和修改Mysql 的字符集

    MySQL会出现中文乱码的原因不外乎下列几点 1 server本身设定问题 例如还停留在latin1 2 table的语系设定问题 包含character与collation 3 客户端程式 例如php 的连线语系设定问题 强烈建议使用ut
  • Linux下安装openldap

    Linux下安装openldap 1 安装Berkeley DB 4 7 25 伯克利大学嵌入式数据库方案 openldap用它作为存储方案 root instance 0pk09gjj ldap wget http download or
  • DAC芯片CBM128S085

    一 硬件介绍 1 1 芯片内部框架图 1 2 CBM12S085引脚定义 引脚介绍 DAC SYNC 电平触发控制输入 低电平有效 SCLK 时钟输入 DAC DIN 串行数据输入 VOUTA H则是对应的8个电压模拟输出通道 二 软件实现
  • 找出数组中每个数的右边第一个比它大的数

    vector
  • 人工智能 猴子摘香蕉问题

    1 定义描述环境状态的谓词 AT x w x在w处 个体域 x monkey w a b c box HOLD x t x手中拿着t 个体域 t box banana EMPTY x x手中是空的 ON t y t在y处 个体域 y b c
  • 三角形

    1 2 3 4 5 6
  • function 与 => 的区别

    function 与 的区别主要是他们的作用域的不同 在JS中 箭头函数并不是简单的function 匿名函数的简写语法糖 实际上 箭头函数和匿名函数有个明显的区别 gt 箭头函数内部的this是词法作用域 在编写函数时就已经确定了 fun
  • CentOS8.4安装Redis6.2.6

    一 下载 官网 Redis 我们下载 Stable 稳定版 cd mydata wget https download redis io releases redis 6 2 6 tar gz 二 安装redis6 2 6 1 安装到 us
  • python编一函数s(x) 求级数和_Python 编程基础之高阶函数篇(一)

    高阶函数 能接受函数作为参数的函数 如 f abs def add x y f return f x f y 如果我们用 add 5 9 f 来调用该高阶函数 则返回结果为 14 abs是Python提供的求绝对值的函数 Python中的m
  • Django实现音乐网站 ⒅

    使用Python Django框架做一个音乐网站 本篇主要为歌单列表 歌单详情及推荐页 歌单内容改动 目录 歌单列表 设置路由 视图处理 模板渲染 歌单 单曲列表 设置路由 视图处理 模板渲染 推荐页 歌单列表 模板渲染修改 总结 歌单列表
  • C语言字节数

    bool 1字节 char 1字节 short 2字节 string 4字节 int 4字节 指针4字节 float 4字节 double 8字节 long 4或8字节 long long 8字节 long double 12字节 空类1字
  • ArcFace loss与其他改进loss对比

    ArcFace loss与其他改进loss对比 sphereFace A softmax cos ma 角度距离 cosFace AM softmax cosa m 余弦距离 ArcFace Arc softmax cos a m 角度距离
  • ICCV, ECCV, CVPR,IEEE的关系

    计算机视觉领域世界三大顶级会议分别为CVPR ICCV和ECCV CVPR CVPR 英文全称IEEE Conference on Computer Vision and Pattern Recognition 中文全称是国际计算机视觉与模
  • FeignClient中name和url属性的作用

    定义 feign是声明式的web service客户端 它让微服务之间的调用变得更简单了 类似controller调用service Spring Cloud集成了Ribbon和Eureka 可在使用Feign时提供负载均衡的http客户端
  • node-ffi ffi.Library往电脑窗口的任意光标处输入内容(user32.dll)window电脑

    node ffi ffi Library往电脑窗口的任意光标处输入内容 user32 dll window电脑 类似键盘输入法的效果 前提 遇到问题 解决问题了 补充安装库遇到的问题 类似键盘输入法的效果 我node项目和electron项
  • 语义分割评价指标mIOU的计算

    语义分割评价指标mIOU的计算 注意事项 这是针对重构了的语义分割网络 而不是之前的那个 所以不要询问原来的网络计算miou要怎么做 因为整个文件构架差距过大 建议使用新构架 学习前言 算一下语义分割的miou 做好生态链 什么是mIOU
  • 北大青鸟汉字注释机内码_北大青鸟消防主机如何编写汉字注释?

    北大青鸟消防主机汉字注释有两种 一种是利用编程调试软件进行编写文字注释 另一种是直接在消防主机上对照汉字机内码 进入系统进行编辑 下面小编跟大家介绍的是使用编程调试软件进行文字注释的方法 1 序号 项 序号 项自动生成 不需用户自己填写 2
  • 【SSO单点登录】JWT续签问题 && OAuth2.0 中的refreshToken刷新机制

    本篇速览 JWT续签问题 快过期时返回新的token refreshToken 如何判断refreshToken的有效性 扩展 OAuth2 0 中的refreshToken刷新机制 其他需要刷新token的情况 用户修改了角色权限 删除了
  • SQL优化之 not in

    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 行 耗