`
weilJava
  • 浏览: 68989 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

sql中not in 、minus 、not exists效率问题

阅读更多
例子:
create table A (
num number(10));
create table B (
num number(10));

表A中记录为1 2 3 9
表B中记录为2 3 4 5

现在要查询出1 9,可以用下面三个语句
(1)select a.num from A a where a.num not in (select b.num from B b);
(2)select a.num from A a minus select b.num from B b (这里a.num和b.num前不需要加distinct也会自动列出不重复的数据,要求两个查询出的列数相同,字段类型相同)
(3)select a.num from A a where not exists (select b.num from B b where b.num=a.num)

当前表A、B的数据量很小以上三个sql查询效率上是不同的,当量大的情况下(1)和(2)(3)效率差距较大,
本人只使用时的数据量(A表4800条记录,B表11600条记录),执行时间如下
(1)  139S
(2)   3S
(3)  2.4S
均是初始执行时间

后期再研究为什么效率会如此大的差距

补充一(转自ITPUB论坛):
minus   剔重且会排序
not exists/not in所谓的anti join,当然前者是真正的anti join,not in可能遇到null麻烦点,可能性能低,如果解决了null的问题,not exists/not in基本差别很小了,cbo会转为等价的写法。他们会返回所有满足条件的主表数据,不管是否有重复。

如果主表不存在重复数据,minus和not exists结果是可以相互转为等价的,但是因为有排序,性能可能要差点,当然排序是一般情况下有,如果全部能从索引获取什么的,可能会消除。

还有种是外连接写法,也可以转成和anti join等价的结果
select a.* from a,b where a.id=b.id(+) and b.id is null;
有时候not exists,not in什么的走不了anti join,也可以考虑这种写法,join在oracle里高效的算法是比较多的
0
0
分享到:
评论

相关推荐

    Sql中的MINUS

    此资源为.txt文件,里面描述了sql中minus的使用方法和案例,如果需要可以下载

    Oracle: minus | in | exists

    NULL 博文链接:https://wuaner.iteye.com/blog/1671927

    SQL语句教程.pdf

    ♦ SQL 指令: SQL 如何被用来储存、读取、以及处理数据库之中的资料。 ♦ 表格处理: SQL 如何被用来处理数据库中的表格。 ♦ 进阶 SQL: 介绍 SQL 进阶概念,以及如何用 SQL 来执行一些较复杂的运算。 ♦ SQL 语法: ...

    MySQL中对于not in和minus使用的优化

    主要介绍了MySQL中对于not in和minus使用的优化,作者给出了实例和运行时间对比,需要的朋友可以参考下

    Minus

    Minus

    SQL语句教程.doc

    SQL指令 2 SELECT 2 DISTINCT 3 WHERE 4 AND OR 5 IN 5 BETWEEN 6 LIKE 7 ORDER BY 8 函数 10 COUNT 11 GROUP BY 12 HAVING 13 ALIAS 13 表格链接 15 外部链接 16 CONCATENATE 17 SUBSTRING 18 TRIM 19 表格处理 21 ...

    SQLPrompt_7.3.0.564

    Fix for extra space being inserted after minus inside IN clause (Forum post) Support ticket 73192: Fix for Inline EXEC not inlining negative variables correctly Support ticket 73072: Fix for cancel ...

    复习笔记SQL34句

    SQL语句(05) IN 2 SQL语句(06) BETWEEN 3 SQL语句(07) LIKE 3 SQL语句(08) ORDER BY 3 SQL语句(09) 函数 3 SQL语句(10) COUNT 3 SQL语句(11) Group By 4 SQL语句(12) HAVING 4 SQL语句(13) ALIAS 4 SQL语句(14) 连接...

    SQL语句生成及分析器(中文绿色)

    3.8 联合 (Union [All],Minus,Intersect) 3.9 字段别名,数据表别名 3.10 SQL子查询表,内嵌SQL子句 4、粘贴字段、系统函数 5、SQL查询语句反向分析, 无论多么复杂的语句,都能分析得出来 包括上面提到...

    union,minus和intersect关系

    union,minus和intersect关系

    C_minus语言词法分析器

    C_minus语言词法分析器 C_minus语言词法分析器

    sql语句生成器+支持各大数据库+说明书

    SQL语句生成器的特色 支持几乎所有类型的数据库, 包括小型(桌面)数据库:Fox DBF、Microsoft Execl、Text、Borland Paradox、 中型数据库:Microsoft Access 大型数据库:Microsoft SQL Server、Sybase、Oracle ...

    使用MINUS实现差值运算.rar

    使用MINUS实现差值运算.rar使用MINUS实现差值运算.rar

    2009达内SQL学习笔记

    NOT 与 IN 在一起使用时,NOT 是找出与条件列表不匹配的行。 IN 列表里有 NULL 时不处理,不影响结果;用 NOT IN 时,有 NULL 则出错,必须排除空值再运算。 in :选择列表的条件 使用IN操作符的优点: 在长的...

    C minus编译器实现

    Compiler construction principles and Practice 对应C minus的代码实现

    SQL语句生成及分析器

    无论多么复杂的语句,都能分析出来(包括SQL各子句中嵌套的SQL语句) 5、数据库视图定义和重建 6、支持将SQL查询语句,替换为插入(Insert into)和更新(Update)语句 7、附属工具内嵌入Delphi IDE(支持Delphi 5和...

    SQLPrompt_7.3.0.651(包含注册机)

    Fix for extra space being inserted after minus inside IN clause (Forum post) Support ticket 73192: Fix for Inline EXEC not inlining negative variables correctly Support ticket 73072: Fix for cancel ...

    C-minus-minus解释器构造

    用JAVACC构造一个解释器,很不错,欢迎下载,课程设计时要用到

Global site tag (gtag.js) - Google Analytics