INとEXISTSの実行計画の違い

公開日: : 最終更新日:2016/03/30 programing

Visual SQL Tuning / wetribe

最近行った現場で見ました。何故か昔から(特にOracle界隈?)盲目的に「INよりEXISTSのほうが速い」という迷信があって、猫も杓子もみーんなEXISTSになっている現場があったりします。

※以下はOracle10g相手にあれこれチューニングした経験を踏まえての記述ですが、大筋は他のDBでも変わらないと思います。

INもEXISTSもそれぞれ、一概にどっちが良いと決まっている訳じゃないので、ケースバイケースでどっちを使うかちゃんと考えないといけません。

結論

・INが適している場合とは→選択的述語が副問合せに有る

・EXISTSが適している場合とは→選択的述語が親問合せに有る

選択的述語なんてふにゃっとした単語がでてきたけど、要は副問合せ側で条件絞込みできる場合はIN、親問合せ側で条件絞込みできる場合はEXISTS(のほうが適している可能性が高い)てことです。

※以下はOracle10gパフォーマンスチューニングガイドからの引用

INのほうが圧倒的に速いパターン

EXISTSの場合、employeesテーブルを全てスキャン後、ordersテーブルを逐一評価するため無駄が多い。

INの場合は、副問合せ内を先に評価した後(ここではカスタマーIDで絞込み)、employeesテーブルと結合するため無駄が少ない。

EXISTSのほうが速いパターン

EXISTSの場合は、employessテーブルを索引であらかじめ絞り込んだ後、ordersテーブルにアクセスするため効率的。

INの場合は、ordersテーブル内の全てがemployeesテーブルへのアクセスに使用されるため非効率。

えいやと言ってしまうのです

誤解を恐れず言ってしまえば、INとEXISTSの違いはSQL文を評価する順番が IN:副問合せ→親問合せ EXISTS:親問合せ→副問合せ になっているという理解で(あんまり?)問題ないかなぁと。

実行計画を交えた詳細はパフォーマンスチューニングガイドをご覧ください。 もちろん現場はそれこそ奇奇怪怪でおっそろしく複雑なSQLが跳梁跋扈してるでしょうが、このへんを変えながら実行計画を比べてみると、突破口がみえてくるんじゃないでしょうか。

PC-記事下-サブ(Amazon)


  • このエントリーをはてなブックマークに追加
  • Pocket
  • 645
    follow us in feedly

ブログ主について

ハマコー(@hamako9999
hamako9999
ブログとtwitterはAndroid成分多め。WordPressやガジェット少々。たまに子育てやランニングが混ざります。お問い合わせはhamako9999.netについてよりお願いします。

関連記事

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

adsense

ハマコー(@hamako9999
hamako9999

SIerでコンシューマ向けサービスの開発してます。ブログはAndroid成分多め。WordPressやガジェット少々。たまに子育てやランニングが混ざります。

お問い合わせはhamako9999.netについてよりお願いします。

PAGE TOP ↑