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】全結合
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
>50件すべてを見に行かなくてすむので飛躍的に早くなることがあります
ついてなければ、パターン①と同様になるということ?
>ついてなければ、パターン①と同様になるということ?
私の言葉を理解しようとしないtakntに答える義務はありませんが、
質問者が惑うと困りますので、ざっくりと書いておきますと、
「オプティマイザが判断と対応を行ってくれるので、
データの中身にもよるけれどパターン2のほうがたいていは早い」です
理解しようとしないのならば、疑問にも 思わないかもしれませんが。
>データの中身にもよるけれどパターン2のほうがたいていは早い」です
これは どう理解すれば いいのでしょうか?
つまり、パターン1が早くなる可能性があると 述べてるということですよね?
それとも 一番遅くても パターン1と同様ということでいいのでしょうか?
>一番遅くても パターン1と同様ということでいいのでしょうか?
「全結合のほうが早くなる場合もあります」と回答中に書いてある
これ以上こまかい事については実データの検証と合わせないと難しく、
簡単に説明する術を私は知らない
回答で疑問があったので、追加で質問です。
【質問内容】
(1) windofjuly様はパターン①を全結合と定義してらっしゃいますが、私はどちらも「内部結合」であると思っておりますが、まずそこの認識が誤っているということでしょうか?WHERE句でもINNER JOINでも結合条件を指定出来るというだけでは?
(2) どちらも「内部結合」であった場合、SQLの記述方法の違いが、実行計画の作成にどういった影響があると思いますか?
いいえ、違います
結果が同じになるだけです
FROM句は、必要とするテーブルと、それらテーブルの結合方法を示しています
その結合方法として全結合や、内部結合などがあります
それに対して、WHERE句では抽出条件を示しているだけであって、
結合方法には関与していません
(2)SQLの記述方法の違いが、実行計画の作成にどういった影響があると思いますか?
おおまかには回答欄に書いたように処理内容が異なってきますので、
処理速度に大きな差が出てくる可能性があるということになります
つまり、FROM句で結合条件を明示した方が、SQLの性能が高い場合が概ねあるという理解でよろしいでしょうか?WHERE句は単なる等価結合の条件を表しているに過ぎず、そのSQLが内部結合かそうでないかという情報は付与出来ないと。
>内部結合かそうでないかという情報は付与出来ない
現時点では、概ね正解です
さらに学習を進めて、
実データも充実してくると例外的なものが出てくるので、それはまたその時に・・・
了解です。ありがとうございました。
当方SEやっているのですが、ORCLEであまり開発した事が無かったもので(DB2、SYBASEは有)、
結構混乱しますね。
また、よろしくお願いします。