クエリ 2 は変数を使用します。
バッチがコンパイルされた時点では、SQL Server は変数の値を認識していないため、OPTIMIZE FOR (UNKNOWN)
と非常によく似たヒューリスティックにフォールバックします。
>
の場合 行の 30% が最終的に一致すると想定します (またはサンプル データでは 3000 行)。これは、以下の実行計画の画像で確認できます。これは、転換点
クラスター化インデックス スキャンを使用するか、非クラスター化インデックス シークおよびキー ルックアップを使用するかで、このクエリに対して。
OPTION (RECOMPILE)
を使用する必要があります 以下の 3 番目の計画に示すように、実際の変数値を考慮に入れるようにします。
スクリプト
CREATE TABLE #Sale ( SaleId INT IDENTITY(1, 1) CONSTRAINT PK_Sale PRIMARY KEY, Test1 VARCHAR(10) NULL, RowVersion rowversion NOT NULL CONSTRAINT UQ_Sale_RowVersion UNIQUE ) /*A better way of populating the table!*/ INSERT INTO #Sale (Test1) SELECT TOP 10000 NULL FROM master..spt_values v1, master..spt_values v2 GO SELECT * FROM #Sale WHERE RowVersion > 0x000000000001C310-- Query #1 DECLARE @LastVersion rowversion = 0x000000000001C310 SELECT * FROM #Sale WHERE RowVersion > @LastVersion-- Query #2 SELECT * FROM #Sale WHERE RowVersion > @LastVersion OPTION (RECOMPILE)-- Query #3 DROP TABLE #Sale
プレ>