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

Optimalizuje SQL Server výpočet DATEADD ve vybraném dotazu?

Funkce SQL Server, které jsou považovány za běhové konstanty jsou hodnoceny pouze jednou. GETDATE() je taková funkce a DATEADD(..., constant, GETDATE()) je také běhová konstanta. Tím, že ponecháte skutečné volání funkce uvnitř dotazu, umožníte optimalizátoru vidět, jaká hodnota bude skutečně použita (na rozdíl od čichání hodnot proměnné) a poté může podle toho upravit své odhady mohutnosti, případně přijít s lepším plánem.

Přečtěte si také toto:Odstraňování problémů se špatným výkonem dotazu:konstantní skládání a vyhodnocování výrazů během odhadu mohutnosti .

@Martin Smith

Můžete spustit tento dotaz:

set nocount on;
declare @known int;
select @known = count(*) from sysobjects;
declare @cnt int = @known;
while @cnt = @known
    select @cnt = count(*) from sysobjects where getdate()=getdate()
select @cnt, @known;

V mém případě po 22 sekundách narazil na hraniční pouzdro a smyčka vystoupila. Důležité je, že smyčka skončila s @cnt nula . Dalo by se očekávat, že pokud getdate() je vyhodnocen na řádek, pak bychom dostali @cnt odlišné od správného @známého počtu, ale ne 0. Skutečnost, že @cnt je nula, když smyčka existuje, ukazuje každý getdate() byla jednou vyhodnocena a poté byla použita stejná konstantní hodnota pro každý řádek filtrování WHERE (neodpovídající žádné). Jsem si vědom toho, že jeden pozitivní příklad nedokazuje teorém, ale myslím si, že případ je dostatečně průkazný.



  1. 10 efektivních způsobů, jak být v práci produktivnější

  2. Závažná chyba:Volání nedefinované funkce sqlsrv_connect() v C:\xampp\htdocs

  3. Rails ověřující selhání jedinečnosti na souběžných vstupech

  4. Jedinečný sloupec MySQL SELECT, kde další sloupec je max