オラクルがクエリの実行計画を理解していないため、非常に当惑しています。これは元のクエリです。
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, '%')))
何も変わっていません!!!!両方の 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)
このクエリを改善する方法を誰か説明できますか? 短絡が機能しない理由を誰かが理解するのを手伝ってくれますか?