Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server ottimizza il calcolo DATEADD nella query selezionata?

Funzioni di SQL Server considerate costanti di runtime vengono valutati una sola volta. GETDATE() è una tale funzione e DATEADD(..., constant, GETDATE()) è anche una costante di runtime. Lasciando la chiamata della funzione effettiva all'interno della query, consenti all'ottimizzatore di vedere quale valore verrà effettivamente utilizzato (al contrario di uno sniff di valore variabile) e quindi può regolare di conseguenza le sue stime di cardinalità, possibilmente inventando un piano migliore.

Leggi anche questo:Risoluzione dei problemi di prestazioni scadenti delle query:piegatura costante e valutazione delle espressioni durante la stima della cardinalità .

@Martin Smith

Puoi eseguire questa query:

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;

Nel mio caso, dopo 22 secondi ha colpito il caso limite e il ciclo è uscito. La cosa importante è che il ciclo è terminato con @cnt zero . Ci si aspetterebbe che se il getdate() viene valutato per riga, quindi otterremmo un @cnt diverso dal conteggio @known corretto, ma non 0. Il fatto che @cnt sia zero quando il ciclo esiste mostra ogni getdate() è stato valutato una volta e quindi è stato utilizzato lo stesso valore costante per ogni riga WHERE filtro (corrispondente a nessuno). Sono consapevole che un esempio positivo non dimostra un teorema, ma penso che il caso sia sufficientemente conclusivo.