夏椰の東屋

- お遊び記録 -

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  108  : 記事  1  : コメント  3954  : トラックバック  30

ニュース


落書きしてね♪

IAM
僕がとった写真です。
ご自由にお使いください。

フィードメーター - 夏椰の東屋 track feed
広告


記事カテゴリ

書庫

日記カテゴリ

Other Site From Kaya

今回もパフォーマンス差異をちらっと。

今回は2つのテーブルを使用します。

USER_INFO DAT
ID N
ID SUBID val

この2つでUSER_INFOはIDとそれに紐づく名前が入っています。

DATにはIDとSUBID、それに対するVALがあります。

#(余談)

#1IDで複数のVALを持つためにSUBIDがついています。

#インデクス張っていないので、あんまり関係ないけど(w

?

この2テーブルで

ユーザ名とID毎で合算したVALの合計値を取得するSQLを2本出します。

パターン1 パターン2
 SELECT 
  SUM(val), 
  (
   SELECT 
    n 
   FROM 
    user_info 
   WHERE 
    user_info.id = dat.id 
  ) name 
 FROM 
  dat 
 GROUP BY id
 
 SELECT 
  SUM(val), 
  user_info.n 
 FROM 
  user_info JOIN dat ON 
   user_info.id = dat.id 
 GROUP BY user_info.n;
 

パターン1はDATからデータをID毎にグループ化し、VALの合計値を出したデータと

SELECT句でサブクエリを使って名前をつけています。

?

パターン2はDATとUSER_INFOをIDでJOIN(結合)して、名前とVALの抽出し、名前ごとにVALを合算しています。

?

まずはUSER_INFO、DAT共に1レコードが入った状態で実行した

クエリプランを見ていただきます。

#これは私の牛ノートで実際に動かした結果です。

実行結果その1

パターン1の方がクエリコスト低く出ていますね。

?

ではデータをUSER_INFOに1000件、DATに1000*100件(ID=1000パターンかつSUBID=100パターン)のデータを入れて

同じようにクエリプランをとったものを見てもらいます。

?

実行結果その1

今度はパターン2の方がクエリコストが低くなりましたね。

?

?

これは2つのSQLにそれぞれ特性があるからです。

パターン1はDATで取得した結果N件に対し、N回、USER_INFOを読みに行きますが、

パターン2はDATとUSER_INFOを結合した後に結果を出しているからです。

?

よって、1回目の1行しかない状態ですと、

   ・2テーブルの結合より、N回テーブルを読み行ったほうがコストが低く

2回目のデータが多い場合ですと

   ・N回テーブル読みするよりも、2テーブルを結合したほうが早い

ということがいえると思います。

?

このようにSQLでもデータによって性能の良し悪しが変わることもあるので、

SQLを考える際は、データの分布についても着目していただけたら幸いです。

?

投稿日時 : 2006年12月5日 2:10

コメント

# re: パフォーマンス差異~その2~ 2006/12/05 7:17 ひろえむ
なるほどー。

ちなみに前者(1回目の1行しかない状態)ですがこれは対象が1件(つまりテーブルにはデータがいぱーい)の場合とテーブルにデータが1件しかない場合とでも同じということでしょうか?

サルみたいな質問?(^^;;;;

# re: パフォーマンス差異~その2~ 2006/12/05 7:19 ひろえむ
いやいや、まったく同じという意味じゃなくて、パフォーマンス的に同じような感じの結果になるかな?という意味の質問です。

やっぱサルだな(^^;;; うきー

# re: パフォーマンス差異〜その2〜 2006/12/05 11:23 夏椰
DATの取得対象行分、USER_INFOへのサブクエリが実行されますよ(^-^)


ちなみに100件ではパターン1SQLの方がまだコスト低かったですね。
さぁ何件が分岐点なんでしょう。
#私は時間なくて、そこまで詰めてない

# re: パフォーマンス差異~その2~ 2006/12/05 16:05 おぎわら
「私の牛ノート」
が気になってしょうがありません(TT)

# re: パフォーマンス差異〜その2〜 2006/12/05 17:23 夏椰
型番忘れちゃいました(爆)

夏のボーナスを使い、
さくらや@相模大野で買った
Gatewayのノート君がおらのマシンなんです。

# tiecQivpTzvDSvXoY 2014/08/07 8:04 http://crorkz.com/
4UzSZk I really like and appreciate your post. Really Great.

Post Feedback

タイトル
名前
Url:
コメント