これはシナリオです。sp_executeは異なるクエリプランを選択します
テーブルには多くのフィールドがあります。 フィールド2は、クラスタード・インデックス内の唯一のフィールドです。 他のフィールドを含まないField1、Field2の一意のインデックスが存在します。
テーブルには500000行があり、そのうちの499900はField1に空の値を持ちます。
クエリ1:
SELECT TOP (1) *
FROM Table WITH(UPDLOCK)
WHERE (Field1='XXX') ORDER BY Field1 DESC, Field2 DESC OPTION(OPTIMIZE FOR UNKNOWN)
は、インデックスがユニークインデックスフィールド1、フィールド2、クラスタ化インデックスに、キーのルックアップにシーク生成し、かつ非常に高速です。しかし、
Declare @P1 int;
Exec sp_prepare @P1 output,
N'@0 nvarchar(20)',
N'SELECT TOP (1) *
FROM Table WITH(UPDLOCK)
WHERE ([email protected]) ORDER BY Field1 DESC, Field2 DESC OPTION(OPTIMIZE FOR UNKNOWN)';
Exec sp_execute @P1, N'XXX'
EXEC sp_unprepare @P1;
が遅いクラスタ化インデックスのスキャンを、生成し
。
DBCC FREEPROCCACHEは役に立ちません。したがって、キャッシュされたクエリプランに問題はありません。
質問は、違いは何ですか?
ありがとうございます。
編集:誤って2番目のクエリに同じものを入れ、正しく反映するように更新しました。
@ P1パラメータがコマンド文字列にハードコードされているとどうなるのでしょうか。その後、実行時間は何ですか? – PacoDePaco
パラメータをハードコードすると、計画が同じになります。 – mrQQ