EXISTSを使って遅い場合のチューニング方法

ここでは、ORACLE SQLでEXISTSを使って遅いSQLの特徴とチューニング方法を紹介します。

一般的に、たくさんの参考書や書籍で、EXISTSは速いと紹介してあります。
現に私もIN句をEXISTSで置き換える方法を紹介してたりもします。

しかし、そんなEXISTSでも使い方を間違えると遅くなる場合があります。

次のSQLのように、EXISTSがネストされているような状態だと如実に遅くなります。
なぜなら、table1のデータ1件ごとに、table2の存在確認とtable3の存在確認を行っていくことになります。

table1,2,3、それぞれのデータ件数が多くなればなるほど単純に処理時間が長くなっていきます。

こういう場合は、EXISTSではなく、INを使った方が速い場合があります。
ケースバイケースですが、EXISTSはINに置き換えることが出来るので試してみてください。

◆EXISTSを使っても遅い場合 例

select
a.*
from
table1 a
where
exists (select
‘X’
from
table2 b
where
a.col1 = b.col1
and exists (select
‘X’
from
table3 c
where
b.col2 = c.col2
)
)
;

 

◆置き換えの例

select
a.*
from
table1 a
where
a.col1 in (select
b.col1
from
table2 b
where
b.col2 in (select
c.col2
from
table3 c
)
)
;

 

最後に

最後までお読みいただきありがとうございます。

SQLのチューニングについては、「SELECT文のSQLチューニング方法まとめ」で詳しく解説していますので、ぜひ参考にしてください。