Kueri 2 menggunakan variabel.
Pada saat batch dikompilasi, SQL Server tidak mengetahui nilai variabel sehingga kembali ke heuristik yang sangat mirip dengan OPTIMIZE FOR (UNKNOWN)
Untuk >
itu akan mengasumsikan bahwa 30% dari baris akan cocok (atau 3000 baris dalam data contoh Anda). Hal ini dapat dilihat pada gambar rencana pelaksanaan seperti di bawah ini. Ini secara signifikan melebihi dan di atas 12 baris (0,12%) yang merupakan titik kritis
untuk kueri ini apakah menggunakan pemindaian indeks berkerumun atau pencarian indeks dan pencarian kunci yang tidak berkerumun.
Anda harus menggunakan OPTION (RECOMPILE)
untuk membuatnya memperhitungkan nilai variabel aktual seperti yang ditunjukkan pada rencana ketiga di bawah ini.
Skrip
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