ORACLE 11のJOINについて質問です。

SQLの記述方法としては、下記の2パターンあるかと思います。
【パターン①】
SELECT VALUE1,VALUE2 FOM
TABLE_A A,TABLE_B B
WHERE A.colum = B.colum
【パターン②】
SELECT VALUE1,VALUE2 FOM
TABLE_A A
INNER JOIN TABLE_B B
ON A.colum = B.colum

上記2つのSQLの実行計画を取得したところ、パターン①のSQLに比べパターン②のSQLの方がコスト、実行速度共に優れていました(速度に関しては5倍程度の差がありました)。
無風状態、同一条件、同一取得カラム、実行前にキャッシュをクリア済みという条件で測定したため、性能差はORACLE内部のロジックの違いによるものではないかと思っております。

もし私の仮説が正しいのであれば、どのような違いがあるのかご教示頂きたいです。
性能差が発生するような違いはないという意見でも構いませんので、ご意見頂きたいです。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/01/28 11:33:11
  • 終了:2012/01/29 13:45:14

ベストアンサー

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492012/01/28 13:24:16

【パターン1】全結合
Aが10件、Bが50件だどすれば、
Aを1件読み込むたびに、Bの全てのレコード(50件)と結びつけて、
A.colum = B.columであるかどうかを確認する手間が発生します

【パターン2】内部結合
Aが10件、Bが50件だどすれば、
Aを1件読み込むたびに、B上の相当するレコードを探しにいきます
B.columにインデックスがついていれば、
50件すべてを見に行かなくてすむので飛躍的に早くなることがあります

ただし、
組み合わせが複雑になってくると、全結合のほうが早くなる場合もありますので、
システム開発においては、実データと同じような質よ量の実験用データを用いて、
検証テストを行うのが常となっています

システム開発ではなく、一時的に大量のデータをさばく場合には、
EXPLAINでテストしたりする手間をかけるのではなく、両方書いて、
オプティマイザに自動的に選ばせるという手を使うと良いでしょう
SELECT VALUE1,VALUE2
FROM TABLE_A A INNER JOIN TABLE_B B ON A.colum = B.colum
WHERE A.colum = B.colum

  • id:taknt
    >B.columにインデックスがついていれば、
    >50件すべてを見に行かなくてすむので飛躍的に早くなることがあります

    ついてなければ、パターン①と同様になるということ?

  • id:windofjuly
    うぃんど 2012/01/28 13:58:16
    taknt 2012/01/28 13:31:58
    >ついてなければ、パターン①と同様になるということ?

    私の言葉を理解しようとしないtakntに答える義務はありませんが、
    質問者が惑うと困りますので、ざっくりと書いておきますと、
    「オプティマイザが判断と対応を行ってくれるので、
    データの中身にもよるけれどパターン2のほうがたいていは早い」です
  • id:taknt
    理解しようとするから疑問点が発生するのです。

    理解しようとしないのならば、疑問にも 思わないかもしれませんが。

    >データの中身にもよるけれどパターン2のほうがたいていは早い」です

    これは どう理解すれば いいのでしょうか?

    つまり、パターン1が早くなる可能性があると 述べてるということですよね?

    それとも 一番遅くても パターン1と同様ということでいいのでしょうか?


  • id:windofjuly
    うぃんど 2012/01/28 15:00:34
    taknt 2012/01/28 14:28:04
    >一番遅くても パターン1と同様ということでいいのでしょうか?

    「全結合のほうが早くなる場合もあります」と回答中に書いてある
    これ以上こまかい事については実データの検証と合わせないと難しく、
    簡単に説明する術を私は知らない
  • id:miquado
    質問者です。

    回答で疑問があったので、追加で質問です。
    【質問内容】
    (1) windofjuly様はパターン①を全結合と定義してらっしゃいますが、私はどちらも「内部結合」であると思っておりますが、まずそこの認識が誤っているということでしょうか?WHERE句でもINNER JOINでも結合条件を指定出来るというだけでは?
    (2) どちらも「内部結合」であった場合、SQLの記述方法の違いが、実行計画の作成にどういった影響があると思いますか?


  • id:windofjuly
    うぃんど 2012/01/29 12:53:56
    (1)どちらも「内部結合」であると思っております

    いいえ、違います
    結果が同じになるだけです

    FROM句は、必要とするテーブルと、それらテーブルの結合方法を示しています
    その結合方法として全結合や、内部結合などがあります

    それに対して、WHERE句では抽出条件を示しているだけであって、
    結合方法には関与していません

    (2)SQLの記述方法の違いが、実行計画の作成にどういった影響があると思いますか?

    おおまかには回答欄に書いたように処理内容が異なってきますので、
    処理速度に大きな差が出てくる可能性があるということになります
  • id:miquado
    質問者です。

    つまり、FROM句で結合条件を明示した方が、SQLの性能が高い場合が概ねあるという理解でよろしいでしょうか?WHERE句は単なる等価結合の条件を表しているに過ぎず、そのSQLが内部結合かそうでないかという情報は付与出来ないと。
  • id:windofjuly
    うぃんど 2012/01/29 13:23:21
    >明示した方が、SQLの性能が高い場合が概ねある
    >内部結合かそうでないかという情報は付与出来ない

    現時点では、概ね正解です

    さらに学習を進めて、
    実データも充実してくると例外的なものが出てくるので、それはまたその時に・・・
  • id:miquado
    質問者です。

    了解です。ありがとうございました。
    当方SEやっているのですが、ORCLEであまり開発した事が無かったもので(DB2、SYBASEは有)、
    結構混乱しますね。

    また、よろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません