sql >> Database >  >> RDS >> Sqlserver

Dezelfde zoekopdracht - verschillende uitvoeringsplannen

Query 2 gebruikt een variabele.

Op het moment dat de batch wordt gecompileerd, kent SQL Server de waarde van de variabele niet, dus valt hij terug op heuristieken die erg lijken op OPTIMIZE FOR (UNKNOWN)

Voor > het gaat ervan uit dat 30% van de rijen uiteindelijk overeenkomen (of 3000 rijen in uw voorbeeldgegevens). Dit is te zien in de afbeelding van het uitvoeringsplan zoals hieronder. Dit is aanzienlijk meer dan de 12 rijen (0,12%), namelijk het omslagpunt voor deze zoekopdracht of het een geclusterde indexscan of een niet-geclusterde indexzoekopdracht en sleutelzoekopdrachten gebruikt.

Je zou OPTION (RECOMPILE) . moeten gebruiken om ervoor te zorgen dat het rekening houdt met de werkelijke variabelewaarde zoals weergegeven in het derde plan hieronder.

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. Mysql Real Escape String PHP-functie \ toevoegen aan mijn veldinvoer

  2. Toegestane geheugengrootte van 67108864 bytes uitgeput

  3. Hoe continu iets te verwijderen dat ouder is dan de 10 newst-items van een MySQL-database (mogelijk in JPQL/JPA)

  4. F# error 'error FS0039:De naamruimte of module 'MySql' is niet gedefinieerd'?