2016-08-23 2 views
0

これはシナリオです。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番目のクエリに同じものを入れ、正しく反映するように更新しました。

+0

@ P1パラメータがコマンド文字列にハードコードされているとどうなるのでしょうか。その後、実行時間は何ですか? – PacoDePaco

+0

パラメータをハードコードすると、計画が同じになります。 – mrQQ

答えて

0

可変であるため、同じプランに戻ることをハードコードする場合、または通常の実行でパラメータを配置すると、スキャンする計画が生成されます。

+0

明らかにそれは唯一の違いですが、なぜですか?これはどこに文書化されていますか? – mrQQ

+0

[this](https://msdn.microsoft.com/en-us/library/ee343986(SQL.100).aspx)の記事にいくつかの情報があります。私の意見では、Itzik Ben-Ganの「Querying Microsoft SQL Server 2012」の第17章、レッスン2:「パラメータ化されたクエリとバッチ処理を使用する」の説明がよくあります。 – PacoDePaco

+0

あなたはこの記事のどの部分をこれと関連があると思いますか? – mrQQ

関連する問題