Fråga 2 använder en variabel.
Vid den tidpunkt då partiet kompileras känner SQL Server inte till variabelns värde så faller bara tillbaka till heuristik som mycket liknar OPTIMERA FÖR (OKÄNT)
För > det antar att 30 % av raderna kommer att matcha (eller 3000 rader i din exempeldata). Detta kan ses i utförandeplansbilden nedan. Detta är betydligt utöver de 12 raderna (0,12%) som är vändpunkten
för den här frågan om den använder en klustrad indexsökning eller en icke-klustrad indexsökning och nyckelsökningar.
Du skulle behöva använda OPTION (OMKOMPILERA)
för att få det att ta hänsyn till det faktiska variabelvärdet som visas i den tredje planen nedan.
Skript
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