Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Една и съща заявка - различни планове за изпълнение

Заявка 2 използва променлива.

По време на компилирането на пакета SQL Server не знае стойността на променливата, така че просто се връща към евристика, много подобна на OPTIMIZE FOR (UNKNOWN)

За > ще приеме, че 30% от редовете в крайна сметка ще съвпадат (или 3000 реда във вашите примерни данни). Това може да се види в изображението на плана за изпълнение по-долу. Това е значително над 12-те реда (0,12%), което е повратната точка за тази заявка в това дали използва сканиране на клъстерен индекс или търсене на неклъстерен индекс и търсене на ключове.

Ще трябва да използвате OPTION (RECOMPILE) за да го накарате да вземе предвид действителната стойност на променливата, както е показано на третия план по-долу.

Скрипт

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. Как да деактивирате улавянето на промяна на данни (CDC) в база данни в SQL Server - урок за SQL Server

  2. Linux - PHP 7.0 и MSSQL (Microsoft SQL)

  3. Имената на файлове на SQL Server спрямо версиите

  4. PIVOT заявка към различни записи

  5. Как да внедрим полиморфни асоциации в съществуваща база данни