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ý.