2015.01.14 システム
結合とは
システムの上松です。
SQLを書くとき、結合はどうしてますか?
パパパッとプライマリキーで結合して、終わり! ですか?
同じ結果を返すSQLであっても、内部的なコストが結合条件1つで
大幅に変わることもあります。
たとえばこのSQL
SELECT
MST.年月
,MST.会員ID
,MST.氏名
,MST.入会日
,MST.大会日
,MST.会員グループ
,MST.コミュニティ番号
,GLOG.入室時間
,GLOG.退室時間
FROM
会員マスタ MST
,グループ参加ログ GLOG
WHERE MST.会員ID = ‘A01235678’
AND MST.会員ID = GLOG.会員ID
AND GLOG.年月 = ‘201310’
AND MST.年月 = ‘201310’
さらにもう一つSQL
SELECT
MST.年月
,MST.会員ID
,MST.氏名
,MST.入会日
,MST.大会日
,MST.会員グループ
,MST.コミュニティ番号
,GLOG.入室時間
,GLOG.退室時間
FROM
会員マスタ MST
,グループ参加ログ GLOG
WHERE MST.会員ID = ‘A01235678’
AND MST.会員ID = GLOG.会員ID
AND GLOG.年月 = ‘201310’
AND MAST.年月 = DAYD.年月
年月持ちしている「会員マスタ」と「グループ参加ログ」を結合しているSQLです。
さて、この二つのSQLで実行結果は異なるでしょうか?
実はどちらも同じデータが返ってきます。じゃあどっちでも同じじゃないかいい加減にしろ!
この二つのSQLは、返却されるデータは同じですが、コストが全く異なります。
上のSQLは、下のSQLの10倍のBYTEコストになります。(COSTはほぼ同じです)
BYTEが膨大であれば、読み出し時に参照されるデータ量が多いため「重いSQL」になります。
結合多すぎても少なすぎてもSQLのパフォーマンスに影響を与えます。
例のSQLは、読み出せるデータ量に違いはないので一見すると問題点がわかりづらいのが特徴です。
結合の良しあしは、SQLのチューニングポイントの一つとして覚えておくといいかもしれませんね。