Forespørgsel 2 bruger en variabel.
På det tidspunkt, hvor batchen kompileres, kender SQL Server ikke værdien af variablen, så den falder bare tilbage til heuristik, der ligner OPTIMIZE FOR (UKENDT)
For > det vil antage, at 30% af rækkerne vil ende med at matche (eller 3000 rækker i dine eksempeldata). Dette kan ses på udførelsesplanbilledet som nedenfor. Dette er væsentligt ud over de 12 rækker (0,12%), som er vendepunktet
for denne forespørgsel, om den bruger en klynget indeksscanning eller en ikke-klynget indekssøgning og nøgleopslag.
Du skal bruge OPTION (RECOMPILE)
for at få den til at tage hensyn til den faktiske variabelværdi som vist i den tredje plan nedenfor.
Script
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