Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

To samo zapytanie - różne plany wykonania

Zapytanie 2 używa zmiennej.

W momencie kompilacji wsadu SQL Server nie zna wartości zmiennej, więc po prostu wraca do heurystyki bardzo podobnej do OPTYMALIZUJ DLA (NIEZNANE)

Dla > przyjmie, że 30% wierszy zostanie dopasowanych (lub 3000 wierszy w przykładowych danych). Widać to na poniższym obrazie planu wykonania. To znacznie więcej niż 12 wierszy (0,12%), czyli punkt krytyczny dla tego zapytania, niezależnie od tego, czy używa skanowania indeksu klastrowego, czy nieklastrowanego wyszukiwania indeksu i wyszukiwania kluczy.

Musisz użyć OPCJI (RECOMPILE) aby wziąć pod uwagę rzeczywistą wartość zmiennej, jak pokazano w trzecim planie poniżej.

Skrypt

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak napisać .Skip(1000).Take(100) LINQ w czystym SQL?

  2. Jak wykryć, czy wartość zawiera co najmniej jedną liczbę w SQL Server?

  3. Jak podzielić ciąg w SQL Server

  4. Odległość między dwoma punktami przy użyciu typu danych Geografia w sqlserver 2008?

  5. Poprawka:„Oświadczenie BACKUP LOG jest niedozwolone, gdy model odzyskiwania jest PROSTY” w SQL Server (i SQL Edge)