dポイントプレゼントキャンペーン実施中!

Sqlserver2005でスクリプトを実行しているのですが、
Select *
From ( Select文A ) TBL
( データ6万件 ) TBL2
Where TBL.Key *= TBL2.Key
を実行したとき、
Select文A … (1) 1000件数で実行したときと
(2) 1005件数で実行したときと
では20秒(1)が遅いのです。
(2)は1秒もかかりません。件数結果が少ないにも関わらず
時間が遅いことはあるのでしょうか??
どちらも遅いということだとわかるんですが…
実行プランをみたのですが、なにがよいのか判断できませんでした。
しかし、早く返ってくる方はハッシュ結合でした…
Where句で日付の範囲を変えるだけでハッシュ結合になる場合とならない場合があるのも疑問でした…
ご存知の方ご教授お願いいたします。

A 回答 (1件)

一般論として、クエリを分析、実行するオプティマイザはクエリそのものの違い、データ件数の違いだけではなく、


インデックス情報や収集した統計情報も使って最適な実行プランを作成しようとします。
http://technet.microsoft.com/ja-jp/library/cc966 …
また、実行プランはキャッシュされますので、その差が影響する場合もあります。

その意味では、データ量が少し違うだけで別のプランが有利だと「判断する」可能性は当然ながらあります。
(オプティマイザが選択したプランが常に最適というわけではありません)

HashJoinとNested-Loopが本当に唯一の違いなのであれば、質問者さんのこのクエリの実行環境においては、1000件が結合方法を切り替えるボーダーになっている可能性はありますが、それだけが理由なのか、当然ながら開示された情報では圧倒的に情報が不足していますのでコメントすることはできません。
前述の通り、実行プランの選択には多くの要素があることを認識いただくべきだと思います。
    • good
    • 0
この回答へのお礼

回答の程ありがとうございます。
現在HashJoinを考えておりました。
しかし データ6万件 のSQL文の条件がしぼれそうなので
もう少ししぼって外部結合を行ってみます。
今まで、条件(月単位毎に集計を行う為、年月が範囲になります。)が異なってもこのように数十秒もかかることはなかったので悩んでます。
深く調べてみます。ありがとうございます。

お礼日時:2009/11/03 16:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!