`
nesta2001zhang
  • 浏览: 70798 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle中exists与in的效率探讨

 
阅读更多
in 与 exist 的语法比较:
          select × from 数据表 t where t.x in (...)
      括号内可以是符合t.x字段类型的值集合,如('1','2','3'),但如果t.x是number类型的时候,似乎这样的写法会出问题;也可以是通过另外的select语句查询出来的值集合,如(select y from 数据表2 where ...)。

          select * from 数据表 t where [...] and exist (...)
      方括号内为其它的查询条件,可以没有。exist后面的括号内可以是任意的条件,这个条件可以与外面的查询没有任何关系,也可以与外面的条件结合。如:(select * from 数据表2 where 1=1) 或 (select * from 数据表2 where y=t.x)

例子:

in的SQL语句
SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
FROM tab_oa_pub WHERE is_check=1 and
category_id in (select id from tab_oa_pub_cate where no='1')
order by begintime desc

exists的SQL语句
SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
FROM tab_oa_pub WHERE is_check=1 and
exists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1')
order by begintime desc

效率比较:

        先讨论IN和EXISTS。
            select * from t1 where x in ( select y from t2 )
        事实上可以理解为:
            select * from t1, ( select distinct y from t2 ) t2 where t1.x = t2.y
         如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。但是t1可以很大,为什么呢?最通俗的理解就是因为t1.x=t2.y可以走索引。但这并不是一个很好的解释。试想,如果t1.x和t2.y都有索引,我们知道索引是种有序的结构,因此t1和t2之间最佳的方案是走merge join。另外,如果t2.y上有索引,对t2的排序性能也有很大提高。

            select * from t1 where exists ( select null from t2 where y = x )
        可以理解为:
            for x in ( select * from t1 )
            loop
                if ( exists ( select null from t2 where y = x.x ) then
                   OUTPUT THE RECORD!
                end if
            end loop
        这个更容易理解,t1永远是个表扫描!因此t1绝对不能是个大表,而t2可以很大,因为y=x.x可以走t2.y的索引。

        综合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
分享到:
评论

相关推荐

    oracle中exists_和in的效率问题详解

    Oracle 中 EXISTS 和 IN 的效率问题详解 EXISTS 和 IN 都是 Oracle 中的集合操作符,但它们在使用和执行效率上有所不同。本文将深入探讨 EXISTS 和 IN 的使用场景、执行机制和效率问题。 EXISTS 的使用场景和机制 ...

    “exists”和“in”的效率问题

    ### "Exists"与"In"的效率问题详解 #### 引言 在数据库查询语言SQL中,“Exists”与“In”是两种常用的子查询方法,它们在实际应用中各有优势与局限。本文将深入探讨这两种方法的工作原理、应用场景以及性能差异,...

    提高Oracle数据库查询效率

    在Oracle数据库管理与优化领域,提高查询效率是至关重要的一个环节。这不仅能够显著提升应用程序的性能,还能减少数据库服务器的负载,从而为用户提供更流畅的服务体验。本文将结合提供的SQL示例,深入探讨如何通过...

    oracle中not exists对外层查询的影响详解

    本文将深入探讨`NOT EXISTS`如何影响外层查询,并通过示例解释在不同版本的Oracle数据库中可能存在的差异。 首先,让我们回顾`NOT EXISTS`的基本用法。当我们在一个查询中使用`NOT EXISTS`时,它会检查子查询中的...

    Oracle语句规划详解

    在数据库管理与开发过程中,优化Oracle SQL语句对于提升系统的整体性能至关重要。优化不仅仅意味着更快的数据查询速度,还能减少资源消耗,提高数据库服务器的稳定性。本文将详细介绍30个Oracle语句优化规则,并深入...

    Oracle常用关键词和函数

    在本文中,我们将深入探讨一些Oracle中常用的关键词和函数。 首先,我们来看NVL()函数,这是一个非常实用的处理空值(NULL)的函数。NVL(a, b)的作用是如果表达式a的值为NULL,则返回b的值,否则返回a的值。这在...

    探讨煤炭企业中ORACLE数据库的应用.pdf

    例如,使用表连接查询来合并不同表中的信息,利用NOT IN运算符或外连接查询优化查询效率;使用DELETE命令删除重复数据,根据数据量大小选择IN子句或SELECT子句以提高删除速度;在查找不同数据记录时,通过NOT EXISTS...

    ORACLE数据库优化理论探讨.pdf

    此外,子查询中用`WHERE (NOT) EXISTS`代替`IN`或`NOT IN`语句通常更高效。视图查询转化为直接对数据表的查询,也能减少性能开销。 综上所述,Oracle数据库优化是一个多维度的过程,涉及数据库设计、SQL语句编写、...

    oracle操作文档

    虽然 IN 和 EXISTS 都可以用来判断某个值是否存在于另一个集合中,但 EXISTS 通常更高效,因为它只需要判断行是否存在,而不必关心具体的值。 - 示例:使用 EXISTS:`SELECT * FROM T1 WHERE EXISTS (SELECT 1 FROM...

    Oracle+SQL优化之使用索引提示一例

    在Oracle数据库管理与优化的实践中,SQL语句的执行效率直接影响着系统的响应速度与资源消耗。当面对复杂的查询或批量更新操作时,合理利用索引提示(Index Hint)成为提升SQL执行效率的关键策略之一。本文通过一个...

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

    `in和exists的区别与SQL执行效率分析 - diction - 博客园.htm`探讨了这两个子查询操作符的性能差异。通常,EXISTS在处理大量数据时比IN更快,因为它只需检查是否存在匹配项,而无需返回实际值。 3. **SQL语句优化*...

    Oracle 子查询

    Oracle子查询是构建复杂查询的基石,通过合理利用单行或多行子查询,结合`IN`、`ANY`、`SOME`、`ALL`、`EXISTS`等关键字,可以极大地提高查询的灵活性和效率。理解并熟练掌握子查询的使用,对于提升数据库操作技能和...

    Oracle——sql语句优化

    在Oracle数据库环境中,SQL语句的优化是提升查询效率、减少系统资源消耗的关键环节。通过对特定操作符的合理运用,可以显著改善数据检索的速度与准确性。本文将深入探讨几种常见的SQL操作符及其优化方法,包括IN、...

    Oracle中优化SQL的原则

    例如,在WHERE子句中使用IN或EXISTS可以利用索引来提高查询效率。 3. **合理使用提示**:在SQL语句中添加适当的提示可以帮助优化器选择更高效的执行计划。 4. **优化连接条件**:合理设置连接条件有助于减少不必要的...

    oracle数据库性能调优(3)

    在本系列文章中,作者杨万富展示了如何使用Oracle 10g版本来分析嵌套循环执行计划,并在后续文章中会探讨散列连接和归并连接,以及IN子查询和EXISTS子查询的分析,这些都对深入理解Oracle数据库的性能调优具有重要...

    oracle 查询优化改写

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

    oracle sql性能调优

    3. **使用NOT EXISTS替代NOT IN**:与EXISTS类似,NOT EXISTS在处理NULL值时表现更佳,因为它不会排除那些在子查询中没有对应值的行。例如,`SELECT * FROM table WHERE NOT EXISTS (SELECT 1 FROM other_table ...

    Oracle通配符,运算符的使用

    本文旨在深入探讨Oracle数据库中通配符与运算符的使用方法,帮助读者更好地理解和掌握这些关键概念。 #### 二、Oracle通配符详解 在Oracle数据库中,通配符主要用于模糊查询,即通过模式匹配来检索符合特定条件的...

    oracle之SQL优化

    本篇文章将深入探讨Oracle中的SQL优化技术,包括理解执行计划、索引优化、连接优化、子查询优化、缓存策略以及SQL调优工具的使用。 1. **理解执行计划** - **执行计划**:在Oracle中,每一条SQL语句都会有一个执行...

Global site tag (gtag.js) - Google Analytics