« ADSL新料金 | Main | SQLの複雑さと実行回数 »

2003.12.19

外部結合

DBによって結果は異なってくるかもしれませんが、
A,B,Cの3つのテーブルがあって、それぞれのデータ量の比が10:12:30〜40で、
Aを第一基準としてCのデータを取得する場合、とりあえず
SELECT C.* FROM A,B,C WHERE A.hoge='hoge' AND B.A_KEY=A.AKEY AND B.fuga='fuga' AND C.BKEY=B.BKEY AND C.funi='funi'
って感じのSQLと、
SELECT C.* FROM A
LEFT OUTER JOIN B ON B.A_KEY=A.A_KEY AND B.fuga='fuga'
LEFT OUTER JOIN C ON C.B_KEY=B.B_KEY AND C.funi='funi'
WHERE A.hoge='hoge'
って感じのSQLが思い浮かびますが・・・(実際は*での取得は行いませんが)
環境によっては、後者の方が圧倒的に速い場合があるんですね〜。

テーブルAのレコード数が80万くらいのデータで試したところ、
前者で1分〜2分、後者で1〜2秒という結果が得られました(^^;;
もちろん、インデックスの状態や、上で書いたようにDBサーバによって結果は異なってくる可能性はありますが、
ここまで違うとちょっとびっくり。
おそらく、WHEREでの絞込みを行う部分で余計な結合を行う必要がないことがこのような結果につながっているとは思うのですが。

ただ、LEFT OUTERで結合しているため、前者だとはじかれるようなデータが混入する可能性もあるため、
それに対する後処理を忘れないようにしなければいけませんが(^^;;

|

« ADSL新料金 | Main | SQLの複雑さと実行回数 »

DB」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/36431

Listed below are links to weblogs that reference 外部結合:

« ADSL新料金 | Main | SQLの複雑さと実行回数 »