sql >> Databáze >  >> RDS >> Sqlserver

Stejný dotaz – různé prováděcí plány

Dotaz 2 používá proměnnou.

V době kompilace dávky SQL Server nezná hodnotu proměnné, takže se vrátí k heuristice velmi podobné OPTIMIZE FOR (UNKNOWN)

Pro > bude předpokládat, že 30 % řádků se nakonec shoduje (nebo 3 000 řádků ve vašich vzorových datech). To lze vidět na obrázku prováděcího plánu, jak je uvedeno níže. To je výrazně více než 12 řádků (0,12 %), což je bod zlomu pro tento dotaz v tom, zda používá skenování indexu v clusteru nebo hledání indexu bez clusteru a vyhledávání klíčů.

Budete muset použít OPTION (RECOMPILE) abyste jej přiměli vzít v úvahu skutečnou hodnotu proměnné, jak je znázorněno ve třetím plánu níže.

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. ap_proxy_connect_backend deaktivující pracovník pro (127.0.0.1)

  2. mysql SEŘADIT PODLE počtu jedinečných shod slov

  3. Jak zobrazit minimální a maximální hodnotu v dynamické kontingenční tabulce

  4. Počítadlo návštěvníků Laravel