0

次のような SQL ステートメントがあります。

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

バックグラウンド:

  • サブクエリ A と B はどちらも 15 秒で実行でき、20 行未満しか返されません。
  • JOIN CONDITIONS は、結合された 3 つの単純な共通フィールドのみです。
  • 実行計画は問題ないように見えますが、コストは 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 に答える