Zapytanie 2 używa zmiennej.
W momencie kompilacji wsadu SQL Server nie zna wartości zmiennej, więc po prostu wraca do heurystyki bardzo podobnej do OPTYMALIZUJ DLA (NIEZNANE)
Dla > przyjmie, że 30% wierszy zostanie dopasowanych (lub 3000 wierszy w przykładowych danych). Widać to na poniższym obrazie planu wykonania. To znacznie więcej niż 12 wierszy (0,12%), czyli punkt krytyczny
dla tego zapytania, niezależnie od tego, czy używa skanowania indeksu klastrowego, czy nieklastrowanego wyszukiwania indeksu i wyszukiwania kluczy.
Musisz użyć OPCJI (RECOMPILE)
aby wziąć pod uwagę rzeczywistą wartość zmiennej, jak pokazano w trzecim planie poniżej.
Skrypt
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