sql >> Database teknologi >  >> RDS >> Sqlserver

Samme forespørgsel - forskellige eksekveringsplaner

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


  1. Er det muligt at slippe alle fremmednøglebegrænsninger på en tabel på én gang i mySQL 5?

  2. Django app i Docker container kan ikke finde postgres

  3. Sådan skriver du en .Net-applikation, der fungerer med både SqlServer og Oracle (nu hvor System.Data.OracleClient er forældet)

  4. Sqoop Import --password-fil funktion fungerer ikke korrekt i sqoop 1.4.4