
テストデータ
USER_MASTER
USER_ID | DEPT_NO | USER_NAME |
---|---|---|
0021 | 1002 | 小泉 純子 |
0022 | 1003 | 小泉 三郎 |
0023 | 1004 | 小泉 花子 |
0020 | 1001 | 小泉 純一 |
AUTHORIZATION
USER_ID | LOGIN_ID | PASSWD |
---|---|---|
0021 | 10002 | 234567 |
0020 | 10001 | 1234567 |
SQL
INを使う。
1 2 |
SELECT * FROM USER_MASTER WHERE USER_ID IN (SELECT USER_ID FROM AUTHORIZATION ) |
まずは、IN句内のSQLが実行されて、USER_IDが取得されます。その結果をもとにIN句外の条件として使われます。
EXISTSを使う。
1 2 |
SELECT * FROM USER_MASTER A WHERE EXISTS (SELECT * FROM AUTHORIZATION B WHERE A.USER_ID = B.USER_ID ) |
特徴
「相関サブクエリ」を使っているのに、パフォーマンスはかなり高いです。
実行結果
どちらも同じ結果になる。
USER_ID | DEPT_NO | USER_NAME |
---|---|---|
20 | 1001 | 小泉 純一 |
21 | 1002 | 小泉 純子 |
動作の違い
INは主問い合わせのWHERE句の前、EXISTSは後で処理される。基本的にSQLは早い段階で多くのデータを削ぎ落とした方が良いです。
INとEXISTSどちらを使えば良いか?
結論としては、主テーブルと従テーブルのどちらがによって使い分けることが必要です。
上記のサンプルで言えば、INは従テーブル(AUTHORIZATION)の方がインデックスがより効く場合はINを使い、主テーブル(USER_MASTER)へ先にSELECTした方がインデックスが高いパフォーマンスを発揮できる状況であればEXISTSを使うという感じです。(どちらの方がインデックスがより効くかはレコードの選択性によって変わってきます。)
主テーブル(USER_MASTER)の方が従テーブル(AUTHORIZATION)よりもデータ量が多い(USER_MASTERが5件、AUTHORIZATIONが2件)ので、EXISTSを使った方がより適した選択になります。
結論としては、どちらが優れているかではなく使い分けることができるようINやEXITS、インデックスについてしっかり理解することが重要になります。
詳しくはJOINとの違いも含めて下記の記事で解説しています。
この記事へのコメントはありません。