大型查询,多个表,旧的与新的JOIN语法

时间:2011-11-01 14:34:03

标签: oracle join syntax ansi

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

反转此顺序至少可以节省内存,但不必提高执行速度。

答案 2 :(得分:0)

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