Заявка 2 използва променлива.
По време на компилирането на пакета SQL Server не знае стойността на променливата, така че просто се връща към евристика, много подобна на OPTIMIZE FOR (UNKNOWN)
За >
ще приеме, че 30% от редовете в крайна сметка ще съвпадат (или 3000 реда във вашите примерни данни). Това може да се види в изображението на плана за изпълнение по-долу. Това е значително над 12-те реда (0,12%), което е повратната точка
за тази заявка в това дали използва сканиране на клъстерен индекс или търсене на неклъстерен индекс и търсене на ключове.
Ще трябва да използвате OPTION (RECOMPILE)
за да го накарате да вземе предвид действителната стойност на променливата, както е показано на третия план по-долу.
Скрипт
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