2011-01-13 5 views
0

私は何か変わっていく。私はこのSQLを実行した:どのように起こるSP SQLサーバー

SELECT Id , GameTypeId , PlayerId , BetAmount , Profit , 
     DateAndTime 
FROM  Results 
WHERE DateAndTime >= DATEADD (DAY , -1 , SYSDATETIME()) 
     AND 
     DateAndTime < SYSDATETIME() 
ORDER BY DateAndTime ASC; 

iは、日付列
及び表に1600016行から
672行で返す行の実際の数に非クラスタインデックスを有します。その後 (推定された行が1であった)

私はこのSQL実行:

declare @d DATETIME2(7) 
set @d = DATEADD (DAY , -1 , SYSDATETIME()) 
declare @d2 DATETIME2(7) 
set @d2 = SYSDATETIME() 

SELECT Id , GameTypeId , PlayerId , BetAmount , Profit , 
     DateAndTime 
FROM  Results 
WHERE DateAndTime >= @d 
     AND 
     DateAndTime < @d2 
ORDER BY DateAndTime ASC; 

および実際の実行計画は、表SCANEました! であり、返される実際の行数は表の中で
672行から1600016行です。 (推定行は144000r0wsでした)

ここで何が起こったのですか?!?!?

+0

「SET SHOWPLAN_TEXT ON」を実行して、両方のクエリの正確な実行計画を投稿してください。 – Quassnoi

+0

質問の最後の文を「誰かがここで起こったことを知っていますか?テーブルスキャンを回避する方法」と置き換えるのが最も良いかもしれません。 –

答えて

0

推定行の数が非常に多い場合、オプティマイザは、完全な表スキャンが索引のシーク+ RID検索よりも効果的である可能性があるという結論に達します。

ですから、推定される行の数が途方もなくなるのはなぜですか?

私は、残念ながら、まだSQL Serverに詳しくはないです。しかし、私はそれがバインドパラメータのためだと思います。 (他のデータベースでは)カーディナリティ推定(推定行)にかなりの影響を与える可能性があります。

4

値に変数を使用しているため、クエリオプティマイザはWHERE句の選択性を認識せず、テーブルスキャンを使用することを決定します。 DateAndTimeフィールドにクラスタードインデックスを作成してみてください。

+1

変数 - パラメータではありません。変数の値はコンパイル時には分かりません。 'OPTION(RECOMPILE)'が役に立ちます。 –

+0

私はこれを理解しました。しかし、オプティマイザに、クエリを実行するたびに再コンパイルするように指示する方法や、変数に多くの引数を渡すことができれば、この場合は何ができるのでしょうか?実際には、変数は – dani

+1

です! –

2

これは、変数の値が知られたら、文の計画を再コンパイルし、その正確な基数の見積もりを使用することができるようになります

declare @d DATETIME2(7) 
set @d = DATEADD (DAY , -1 , SYSDATETIME()) 
declare @d2 DATETIME2(7) 
set @d2 = SYSDATETIME() 

SELECT Id , GameTypeId , PlayerId , BetAmount , Profit , 
     DateAndTime 
FROM  Results 
WHERE DateAndTime >= @d 
     AND 
     DateAndTime < @d2 
ORDER BY DateAndTime ASC 
OPTION (RECOMPILE); 

を試してみてください。ごくわずかなパーセンテージを選択することがわかっている場合は、FORCESEEK(SQL Server 2008の場合)ヒントを使用して再コンパイルを避けることができますが、このヒントを使用するとキー参照の数が多いため大規模な範囲で致命的に悪い可能性があります。マーティンの答えに加えて

1

...

Results.DateAndTimeはあまりにも変数ごとなど(7)DATETIME2でなければなりません。そうでない場合は、データ型の優先順位の問題がある可能性が最も高いです。

0

推定された行の数が実際の数と大きく異なる場合、統計がどこかにないか、日付。 SSMSのクエリプランを見て、異なるオペレータの基数推計に基づいて、欠落しているか古いかを調べることができます。

関連する問題