2011-01-13 31 views
-1

可能性の重複:
how that happen SP sql server同じクエリに対する異なるクエリプラン!

こんにちは、私は奇妙な何かを得ます。 iは、日付列 、テーブル内1600016行から 672行が返される行の実際の数に非クラスタインデックスが

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

:私はこの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た!!!:私はこのSQLを実行した後

(推定された行は1でした)実際に戻される行の数は、表の中で 672行から1600016行です。 (推定行は144000 rwwsでした)

何人かがここで何が起こっているのか知っていますか?

+1

dup? http://stackoverflow.com/questions/4679563/how-that-happen-sp-sql-server/4679665#4679665 –

+0

二重投稿しないでください – gbn

答えて

0

実行計画を混乱させていないことを確かめてください。私は最初のクエリがテーブルスキャンを必要とすることをSQLで簡単に見ていたでしょう。これは、where行にすべての行で評価する必要がある計算(DATEADD)があるという事実に起因します。これは、演奏者のクエリを書くときに迷うものです。

+0

'DATEADD'計算はすべての行で評価されません。テーブルスキャンを引き起こします。数式には列への参照は含まれません。 'create table #t(i int);を試してみるだけで、この型の式が評価されることを確認する。 INSERT INTO #t sys.all_columnsから%2を選択してCHECKSUM(NEWID())を選択します。i、COUNT(*)を#tグループからiで選択します。 #t WHERE i = CHECKSUM(rand())%2からCOUNT(*)を選択してください。ドロップテーブル#t ' –

関連する問題