【问题标题】:Large query, multiple tables, old vs new JOIN syntax大型查询、多个表、旧与新 JOIN 语法
【发布时间】:2011-11-01 14:34:03
【问题描述】:

我有一个连接大约 20 个表(主要是外部连接)的大型查询。它使用带有逗号的旧连接语法和带有 (+) 的外部连接条件。 我们注意到它消耗了大量的服务器内存。我们正在尝试几件事,其中一个想法是将此查询转换为使用较新的 ANSI 语法,因为 ANSI 语法允许更好地控制 JOIN 的顺序,并在应用时明确指定 JOIN 谓词。

对于跨越大量表的此类大型查询,将查询从旧语法转换为新 ANSI 语法是否有助于减少处理的数据量?

【问题讨论】:

  • 通常我会说不,这不会影响性能 - 除非您使用基于成本的优化器。您使用的是哪个 Oracle 版本?你能发布查询吗?
  • 谢谢大家。您帮助我们节省了一些时间,因此我们没有立即将重点放在不太重要的领域。从长远来看,我们计划转向 ANSI 语法。另外,感谢有关减少服务器内存要求的其他建议。

标签: oracle join syntax ansi


【解决方案1】:

根据我的经验,它不会 - 它会生成相同的执行计划。也就是说,较新的 JOIN 语法确实允许您完成旧语法无法完成的事情。出于这个原因,为了清楚起见,我建议转换它。 ANSI 语法更容易阅读(至少对我而言)。转换后,您可以比较执行计划。

【讨论】:

  • +1 为清晰起见 - ANSI 语法更加简洁(除了允许额外的东西,如完全外连接等)
【解决方案2】:

DCookie 说了所有关于 ANSI 语法的内容。

但是,如果你外连接 20 个表,难怪你会消耗大量的服务器内存。也许如果您在较小的子查询中减少查询,它可能会提高性能。这样,并非所有表都必须在内存中读取,然后在内存中加入,然后过滤,然后只选择您需要的列。

颠倒这个顺序至少会节省内存,尽管它不必提高执行速度。

【讨论】:

    【解决方案3】:

    正如 DCookie 所提到的,两个版本都应该产生相同的执行计划。我将首先查看当前查询的执行计划并找出实际占用内存的内容。快速查看 DBMS_XPLAN.DISPLAY_CURSOR 输出应该是一个好的开始。一旦您确切知道要改进查询的哪一部分,您就可以分析切换到 ANSI 样式的连接是否有助于您达到最终目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      相关资源
      最近更新 更多