sql >> Databasteknik >  >> RDS >> Sqlserver

Samma fråga - olika genomförandeplaner

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


  1. Oracle motsvarande SQL Server DATEPART

  2. Hämta RowId från QueryChangeDescription

  3. Hur stänger jag av Oracle-lösenordets utgång?

  4. Android push-uppdateringar på Play Butik