0

我有如下 SQL 语句:

SELECT {SOME CASE WHEN STATEMENTS}
FROM {SUBQUERY 1} A, {SUBQUERY 2} B
WHERE {SOME JOIN CONDITIONS}

背景:

  • 子查询 A 和 B 都可以在 15 秒内执行并返回少于 20 行。
  • JOIN CONDITIONS 只是三个简单的普通字段绑定在一起。
  • 执行计划看起来不错,只有 25 个成本。

问题在于整个连接操作需要 4 到 5 分钟才能运行。

谁能告诉我造成这种情况的任何可能性?

4

1 回答 1

1

尝试使用 NO_PUSH_PRED 提示:
http

://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#BABGJBJC 或者尝试将查询重写为:

SELECT {SOME CASE WHEN STATEMENTS}
FROM ( 
    SELECT * FROM (
         { SUBQUERY 1}
    )
    WHERE rownum > 0
) A, 
(
    SELECT * FROM (
        {SUBQUERY 2}
    ) 
    WHERE rownum > 0
) B
WHERE {SOME JOIN CONDITIONS}

这将防止将连接谓词插入嵌套子查询。
然后两个子查询都应该使用“旧”计划执行,总时间应该是 15+15 秒 + 连接两个子查询的 40 行的一小段时间。

于 2013-09-04T20:21:04.573 回答