1

オラクルがクエリの実行計画を理解していないため、非常に当惑しています。これは元のクエリです。

SELECT *
FROM T1 INNER JOIN T2
ON TI.INDEX1 = T2.INDEX1
WHERE
        T1.C1 LIKE CONCAT('%', CONCAT(:param1, '%'))
    AND T2.C2 LIKE CONCAT('%', CONCAT(:param2, '%'))

このクエリの結果には 60 秒かかります (両方のパラメーターに null 値を使用しています)。

問題を突き止めようとしたところ、T2.C2 が問題であることがわかりました。条件に15秒かかる秒なしの同じクエリなので、次のように変換しました。

SELECT *
FROM T1 INNER JOIN T2
ON TI.INDEX1 = T2.INDEX1
WHERE
        (:param1 IS NULL OR T1.C1 LIKE CONCAT('%', CONCAT(:param1, '%')))
    AND (:param2 IS NULL OR T2.C2 LIKE CONCAT('%', CONCAT(:param2, '%')))

これは実行計画です: 2条件の実行計画

何も変わっていません!!!!両方の where 句を使用すると、クエリに 60 秒かかります!!!

私はこれを結びました:

SELECT *
FROM T1 INNER JOIN T2
ON TI.INDEX1 = T2.INDEX1
WHERE
        (:param1 IS NULL OR T1.C1 LIKE CONCAT('%', CONCAT(:param1, '%')))
    AND (:param2 IS NULL)

15秒かかります。 1条件の実行計画

このクエリを改善する方法を誰か説明できますか? 短絡が機能しない理由を誰かが理解するのを手伝ってくれますか?

4

0 に答える 0