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
                )
        )
;

Oracle SQLチューニング パフォーマンス改善と事前対策に役立つ (DB selection) [ 加藤祥平 ]

価格:2,808円
(2018/11/19 19:23時点)