`
weilJava
  • 浏览: 70010 次
  • 性别: 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
分享到:
评论

相关推荐

    Oracle: minus | in | exists

    在Oracle数据库中,`MINUS`、`IN` 和 `EXISTS` 是三种不同的SQL查询操作符,它们各自用于特定的数据处理场景。了解并熟练掌握这些操作符对于优化查询性能和编写复杂的SQL语句至关重要。 1. **MINUS 操作符** `MINUS...

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

    在MySQL数据库中,`NOT IN` 和 `MINUS` 是两种常用的子查询操作,用于从结果集中排除特定的行。然而,这些操作在某些情况下可能会导致性能问题,特别是在处理大量数据时。本篇文章将探讨如何对这两种操作进行优化,...

    SQL语句教程.pdf

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

    SQL语言在透视表中的应用

    在where子句查询条件中,我们会详细了解运算符的使用,以及如何通过or与and、between...and、in/not in、like、any(some)、(not)exists等关键字构建更复杂的查询条件。这些都对于精确地从数据库中提取需要的信息至关...

    SQL编程规范(还不错哦)

    1. 尽量少用嵌套查询,使用 not exist 代替 not in 子句。 2. 用多表连接代替 EXISTS 子句。 3. 少用 DISTINCT,用 EXISTS 代替。 4. 使用 UNION ALL、MINUS、INTERSECT 提高性能。 5. 使用 ROWID 提高检索速度。 6....

    Oracle和SQL_Server的语法区别

    - Oracle 支持 `INTERSECT` 和 `MINUS` 集合运算符,而 SQL Server 用 `EXISTS` 和 `NOT EXISTS` 子句来实现相同的效果。 对于示例中的 `INTERSECT` 和 `MINUS` 运算符,可以使用 `EXISTS` 或 `NOT EXISTS` 来达到...

    sql优化心得

    - 方法a:`SELECT * FROM A WHERE A.C NOT IN (SELECT C FROM B)`可能效率较低。 - 方法b:`SELECT A.* FROM A, B WHERE A.C = B.C (+) AND B.C IS NULL`使用外连接,但注意性能问题。 - 方法c:`SELECT * FROM A...

    Sql Server与Oracle的区别

    - **SELECT语句**:尽管基本语法相似,但Oracle支持特定的优化提示和集合运算符如START WITH和CONNECT BY,以及INTERSECT和MINUS,这些在Sql Server中需要通过其他方式实现,比如使用EXISTS和NOT EXISTS子句。...

    Oracle Database 11g SQL Fundamentals 英文原版

    3. 子查询:理解嵌套查询的概念,掌握IN、NOT IN、EXISTS、NOT EXISTS等子查询用法。 4. 分区和索引:了解Oracle的分区技术,如何提高查询性能,以及索引的创建、管理和使用。 5. 视图:创建和使用视图以简化复杂...

    oracle sql调优原则

    - **IN/NOT IN操作符优化**:在业务密集的SQL中尽量避免使用`IN`和`NOT IN`操作符,可以使用`EXISTS`或`NOT EXISTS`来代替,以提高性能。同时,如果使用`IN`操作符,应将出现频率最高的值放在列表的前面。 - **IS ...

    经典全面SQL 面试题

    面试中,SQL题目的设计通常是为了评估应聘者的数据查询、数据处理和问题解决能力。以下是对所给面试题目的详细解析: 1. 查询每门课都大于80分的学生姓名: 这个问题可以通过三种方式解决: - 使用MINUS操作符: ...

    sql 书写规范

    1. 尽量少用嵌套查询,如必须,请用 not exist 代替 not in 子句。 2. 用多表连接代替 EXISTS 子句。 3. 少用 DISTINCT,用 EXISTS 代替。 4. 使用 UNION ALL、MINUS、INTERSECT 提高性能。 5. 使用 ROWID 提高检索...

    Oracle高级sql学习与练习

    Oracle高级SQL学习与练习涵盖了数据库编程中的一系列高级主题,旨在帮助数据库开发者和管理员提高解决复杂问题的能力。在Oracle数据库系统中,高级SQL技能是进行高效数据管理、查询优化和复杂数据处理的基础。 1. ...

    异种数据库函数和标准SQL语法比较Oracle与SqlServer.rar

    - Oracle和SQL Server都支持`JOIN`,但Oracle的`MINUS`和`INTERSECT`操作在SQL Server中可以用`NOT EXISTS`和`INNER JOIN`或`UNION ALL`替代。 通过了解这些差异,开发者可以在跨平台项目中更高效地编写SQL语句,...

    oracle和SQL的语法区别

    此外,Oracle 的 `INTERSECT` 和 `MINUS` 集合运算符在 SQL Server 中可以用 `EXISTS` 和 `NOT EXISTS` 子句来模拟。 总的来说,Oracle 到 SQL Server 的迁移不仅仅是简单的语法转换,还需要理解两者在处理逻辑、...

    SQL基础知识大全

    - **集合**:`IN`, `NOT IN` - **字符匹配**:`LIKE`(使用“%”匹配任意字符,“_”匹配单个字符),`NOT LIKE` - **空值判断**:`IS NULL`, `IS NOT NULL` - **子查询**:`ANY`, `ALL`, `EXISTS` - **集合...

    ORACLE和SQL Server的语法区别

    - 使用`EXISTS` 或 `NOT EXISTS` 替代`INTERSECT` 和 `MINUS` 集合运算符。 **2. INSERT语句** - **Oracle:** Oracle的INSERT语句允许插入单行或多行数据,也支持从一个表向另一个表插入数据。 ```sql INSERT ...

    sql面试题库

    这涉及到SQL中的子查询和连接查询。 #### 示例方法: - **使用MINUS操作符** ```sql (1) SELECT stu_name FROM stu_grade MINUS SELECT stu_name FROM stu_grade g WHERE g.grade ``` - **使用NOT EXISTS...

    sql超实用教程

    SQL(Structured Query Language)是一种用于管理和操作关系型数据库的标准编程语言,它包含了一系列的指令和函数,可以用来执行数据的定义(Data Definition)、数据操作(Data Manipulation)、数据访问控制(Data...

    sql and pl/sql

    - **差集(Minus)**:返回第一个查询结果中存在但不在第二个查询结果中的行。 - **树状结构(ConnectBy)**:用于表示具有层次结构的数据。 #### 八、数据操作 - **资料操作语言(DML)**:包括`INSERT`、`UPDATE`、`...

Global site tag (gtag.js) - Google Analytics