メインテーブルがかなり大きく、EXISTSの中のテーブルがかなり小さく絞れる場合、EXISTS一つだけであればメインテーブルとの結合に変換されて早くなるが、ORでつなげるとメインテーブルの全件走査になってしまう。
EXISTSを二つORでつなげるならUNIONを使って実現すべき。
EXISTS + OR
AND (
EXISTS (SELECT 1 FROM SMALL_TABLE S WHERE S.KEY = MAIN.PK AND S.COND = /*condition*/'')
OR EXISTS (SELECT 1 FROM SMALL_TABLE2 S2 WHERE S2.KEY = MAIN.PK AND S2.COND = /*condition*/'')
)
UNION
AND EXISTS (SELECT 1 FROM (
SELECT KEY FROM SMALL_TABLE S WHERE S.KEY = MAIN.PK AND S.COND = /*condition*/''
UNION
SELECT KEY FROM SMALL_TABLE2 S2 WHERE S2.KEY = MAIN.PK AND S2.COND = /*condition*/''
) U
WHERE U.KEY = MAIN.PK
)
ただし、メインテーブルにORDER BY PKとLIMITがあり、かつEXISTS句の中がLIKE文のような場合だと、たとえかなり小さく絞れても、PKとLIMITを使用した方がいいと判断されてメインテーブルのPKによる全件走査になってしまうことがある。
(EXISTS句の中でUNIONを使わず1つのSQLだけなら問題ないことも多いが。)
そのような場合は、ヒント句と結合順序で調整した方が良い。