INとEXISTSの実行計画の違い
公開日:
:
最終更新日:2016/03/30
programing
Visual SQL Tuning / wetribe
最近行った現場で見ました。何故か昔から(特にOracle界隈?)盲目的に「INよりEXISTSのほうが速い」という迷信があって、猫も杓子もみーんなEXISTSになっている現場があったりします。
※以下はOracle10g相手にあれこれチューニングした経験を踏まえての記述ですが、大筋は他のDBでも変わらないと思います。
INもEXISTSもそれぞれ、一概にどっちが良いと決まっている訳じゃないので、ケースバイケースでどっちを使うかちゃんと考えないといけません。
結論
・INが適している場合とは→選択的述語が副問合せに有る
・EXISTSが適している場合とは→選択的述語が親問合せに有る
選択的述語なんてふにゃっとした単語がでてきたけど、要は副問合せ側で条件絞込みできる場合はIN、親問合せ側で条件絞込みできる場合はEXISTS(のほうが適している可能性が高い)てことです。
※以下はOracle10gパフォーマンスチューニングガイドからの引用
INのほうが圧倒的に速いパターン
1 2 3 4 5 6 |
SELECT /* EXISTS example */ e.employee_id, e.first_name, e.last_name, e.salary FROM employees e WHERE EXISTS (SELECT 1 FROM orders o WHERE e.employee_id = o.sales_rep_id AND o.customer_id = 144); |
EXISTSの場合、employeesテーブルを全てスキャン後、ordersテーブルを逐一評価するため無駄が多い。
1 2 3 4 5 6 |
SELECT /* IN example */ e.employee_id, e.first_name, e.last_name, e.salary FROM employees e WHERE e.employee_id IN (SELECT o.sales_rep_id FROM orders o WHERE o.customer_id = 144); |
INの場合は、副問合せ内を先に評価した後(ここではカスタマーIDで絞込み)、employeesテーブルと結合するため無駄が少ない。
EXISTSのほうが速いパターン
1 2 3 4 5 6 7 8 |
SELECT /* EXISTS example */ e.employee_id, e.first_name, e.last_name, e.salary FROM employees e WHERE e.department_id = 80 AND e.job_id = 'SA_REP' AND EXISTS (SELECT 1 FROM orders o WHERE e.employee_id = o.sales_rep_id); |
EXISTSの場合は、employessテーブルを索引であらかじめ絞り込んだ後、ordersテーブルにアクセスするため効率的。
1 2 3 4 5 6 |
SELECT /* IN example */ e.employee_id, e.first_name, e.last_name, e.department_id, e.salary FROM employees e WHERE e.department_id = 80 AND e.job_id = 'SA_REP' AND e.employee_id IN (SELECT o.sales_rep_id FROM orders o); |
INの場合は、ordersテーブル内の全てがemployeesテーブルへのアクセスに使用されるため非効率。
えいやと言ってしまうのです
誤解を恐れず言ってしまえば、INとEXISTSの違いはSQL文を評価する順番が IN:副問合せ→親問合せ EXISTS:親問合せ→副問合せ になっているという理解で(あんまり?)問題ないかなぁと。
実行計画を交えた詳細はパフォーマンスチューニングガイドをご覧ください。 もちろん現場はそれこそ奇奇怪怪でおっそろしく複雑なSQLが跳梁跋扈してるでしょうが、このへんを変えながら実行計画を比べてみると、突破口がみえてくるんじゃないでしょうか。
PC-記事下-サブ(Amazon)
programingの記事一覧
ブログ主について
関連記事
-
-
Linux初心者から抜け出すための最適本「シェルプログラミング実用テクニック」
しばらく、LinuxやらMacのターミナル触ってると、こんなことを感じる人も多いのでは。 「c
-
-
技術評論社の無料小冊子「電脳会議」がITエンジニアにおススメ
この、電脳時代!!音楽でも本でもなんでもかんでも電子化されている昨今だけど、技術評論社が発行してい
-
-
応答速度28.8倍。WordPressをApacheからNginxに移行して感じたブログ運営
昔からやろうやろうと思って出来ていなかった、このブログ(Wordpress)のWebサーバをAp
-
-
WordPressの任意の記事にだけ目次をつける方法(Table of Contents使用)
ブロガーの皆さん、記事に目次つけてますか? 「つけたい日もあれば、つけたくない日もある」
-
-
10分で設定完了。WordPressに監視サービスNewRelicを無料で導入してみた
アカウント登録からはじめて設定完了まで10分程度。恐ろしいほど手軽に導入できるくせに、情報量が半
-
-
日本初のDrupalイベントでスピーカー登壇してきました in Drupal Camp Japan Kyoto
春うららかな4月の京都。日本初のDrupalCampというイベントで、光栄にもスピーカー登壇して
-
-
サイトイメージががらりと変わるWebフォントを導入してみた。簡単で効果はでかい。使用前後のイメージを添えて。
元旦の朝、ガキ使の録画を見るという重大なミッションが残されているハマコー(@hamako9999
-
-
フラットデザインな配色やレイアウトを参考にする時におすすめのページ。CategoryやColorShemeでの分類が便利
最近ようやく、WordPressで自分が採用しているテーマStingerのデフォルト状態から、デ
-
-
オンラインプログラミング学習の雄、Codecademyのスマフォアプリが出た。その狙いは?
以前から激賞しまくっているCodecademy。 Codecademyがプログラミング学習に最
-
-
WordPressのStingerを自由自在にカスタマイズするための8つの修行
Stinger Advent Calendar 2013、19日目担当のハマコー(@hamako9
a8.net DMMmobile
- PREV
- 「プロとしてのSQLチューニング入門」
- NEXT
- 「プロとしてのOracleアーキテクチャ入門」