`

Oracle中in、exists、left join 的效率

 
阅读更多

也是用到了才知道,oracle in表达式参数支持最大上限1000个,是个头疼的问题,

解决思路:拆分成多个in表达式,每个表达式中参数不超过1000。

 

或者用其他关键字:

 

首先,在oracle中效率排行:表连接>exist>not exist>in>not in;

因此如果简单提高效率可以用exist代替in进行操作,当然换成表连接可以更快地提高效率,具体是用left join代替not in 和not exist,用inner join 代替in和exist,这样可以大大提高效率。具体例子如下:

A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。

比如: 

 

SELECT PUB_NAME 

 

FROM PUBLISHERS 

 

WHERE PUB_ID NOT IN (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS')

 

可以改写成: 

 

SELECT A.PUB_NAME 

 

FROM PUBLISHERS A LEFT JOIN TITLES B ON B.TYPE = 'BUSINESS' AND A.PUB_ID=B. PUB_ID

 

WHERE B.PUB_ID IS NULL

(2)

SELECT TITLE 

 

FROM TITLES 

 

WHERE NOT EXISTS (SELECT TITLE_ID FROM SALES WHERE TITLE_ID = TITLES.TITLE_ID)

 

可以改写成:

SELECT TITLE 

 

FROM TITLES LEFT JOIN SALES ON SALES.TITLE_ID = TITLES.TITLE_ID

 

WHERE SALES.TITLE_ID IS NULL 

 

B、 如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替。

 

比如:

SELECT PUB_NAME 

 

FROM PUBLISHERS 

 

WHERE PUB_ID IN (SELECT PUB_ID FROM TITLES 

 

WHERE TYPE = 'BUSINESS') 

 

可以改写成:

SELECT DISTINCT A.PUB_NAME 

 

FROM PUBLISHERS A INNER JOIN TITLES B ON B.TYPE = 'BUSINESS' AND A.PUB_ID=B. PUB_ID

分享到:
评论

相关推荐

    简述Oracle中in和exists的不同

    且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么exists和in的效率差不多。 例如: 一张大表为A,一张小表B...

    oracle性能优化技巧

    - 在子查询中,使用`EXISTS`通常比`IN`更高效,因为`EXISTS`可以在找到第一个匹配项后立即停止搜索。 12. **NOT EXISTS与NOT IN的比较**: - `NOT IN`可能导致全表扫描,而`NOT EXISTS`则不会,因此在大多数情况...

    Oracle提高查询效率的方法

    使用 EXISTS、NOT EXISTS、IN、LEFT OUTER JOIN 等来代替 NOT 操作。 2. 注意 union 和 union all 的区别:union 比 union all 多做了一步 distinct 操作,能用 union all 的情况下尽量不用 union。 3. 查询时尽量...

    Oracle常用关键词和函数

    左连接(LEFT JOIN ON)保留左表的所有行,即使在右表中没有匹配的行,用NULL填充。右连接(RIGHT JOIN ON)反之,保留右表的所有行。完整外部连接(FULL JOIN ON)返回两个表中的所有行,无论是否有匹配项,未匹配...

    Oracle和MySQL语句区别.doc

    例如,在Oracle中,可以使用IN、EXISTS、NOT EXISTS等关键字来实现Subquery,而在MySQL中,则使用IN、EXISTS等关键字。 索引 索引是数据库性能优化的重要手段。Oracle和MySQL都支持创建索引,但是它们在创建索引时...

    oracle操作文档

    - **NOT IN**:强烈建议不使用 NOT IN,因为它无法利用索引,可以使用 EXISTS 或者 LEFT JOIN 来代替。 - 示例:使用 NOT EXISTS 替代:`SELECT * FROM T1 WHERE NOT EXISTS (SELECT 1 FROM T2 WHERE T1.ID = T2.ID...

    dbms.rar_Sql queries_in_oracle queries

    2. **联接查询**:Oracle支持INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN以及自连接,这些用于合并来自两个或多个表的数据。 3. **子查询**:在主查询内部嵌套一个或多个查询,用于提供条件或者计算值。例如,IN...

    oracle 复杂查询语句的使用

    在Oracle中,有三种类型的外连接:左外连接(LEFT JOIN),右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)。以下是一个左外连接的例子,展示所有学生的信息,即使他们没有特长: ```sql SELECT students.st_...

    Oracle查询优化改写 技巧与案例.pdf

    在多表连接查询中,内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)各有其适用的场景。根据数据的特点选择最合适的连接方式,可以显著影响查询的性能。 2. 利用...

    oracle和sql server

    - Oracle同样支持这两种方式,但在实际应用中,通常推荐使用`EXISTS`子句,因为它可以避免子查询的全表扫描,从而提高查询效率。 10. **数值截断**: - Oracle支持使用`TRUNC`函数来截断数值,例如:`SELECT ...

    Oracle Database 11g SQL Fundamentals 英文原版

    1. 联接操作:学习JOIN、CROSS JOIN、INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN,以及如何通过自连接处理复杂的表间关系。 2. 分组与聚合函数:使用GROUP BY和ROLLUP运算进行数据分组,以及AVG、SUM、COUNT、...

    韩顺平Oracle教学笔记.docx

    from子句可以使用inner join、left join、right join等来指定联结方式。 8. 子查询: 子查询是select语句中的一种嵌套查询,用于查询结果中包含其他查询结果。子查询可以使用exists、in、all等关键字来指定查询条件...

    oracle 性能调整 sql性能优化大全

    多篇`ORACLE SQL语句优化技术分析-太平洋电脑网Pconline-[ORACLE].htm`文件可能包含如何重构SQL语句以减少全表扫描、避免笛卡尔积、使用适当的连接类型(如INNER JOIN、LEFT JOIN等)以及优化嵌套查询的技巧。...

    oracle部分面试题oracle部分面试题

    从这些解决方案中可以看出,Oracle 提供了多种方式来实现同一个查询任务,这也体现了 Oracle 的灵活性和强大性。 面试题二(上海) 题目:算出商品 A,B 目前还剩多少? 知识点: * 使用 UNION ALL 语句来实现...

    Oracle数据库优化

    10. 选择正确的连接类型:在联接操作中,考虑使用INNER JOIN、LEFT JOIN、RIGHT JOIN或FULL OUTER JOIN,根据业务需求选择最高效的连接类型。 11. 避免在索引列上使用计算:如果在索引列上进行计算,Oracle无法直接...

    oracle SQL语法大全.rar

    2. 子查询优化:使用EXISTS或IN代替子查询,提高查询效率。 3. 视图:CREATE VIEW创建虚拟表,简化复杂的查询。 4. 游标:在PL/SQL中处理单行或多行结果集的机制。 5. 窗口函数:RANK()、ROW_NUMBER()、LEAD()、LAG...

    oracle 查询优化改写

    4. 减少子查询,尽可能用连接替换子查询,或使用exists和in子句代替not in,因为前者通常效率更高。 三、并行查询 对于大规模数据处理,启用并行查询可以将任务分散到多个处理器上,缩短执行时间。但需注意,过度...

    OracleSQL实例-复杂查询语句的使用实例.pdf

    外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN),在这个案例中使用的是左外连接,确保了所有学生信息都能被列出,而不仅仅是那些在 `student_skill` 表中有记录的学生。...

Global site tag (gtag.js) - Google Analytics