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

Czy SQL Server optymalizuje obliczenia DATEADD w zapytaniu wybierającym?

Funkcje programu SQL Server, które są uważane za stałe uruchomieniowe są oceniane tylko raz. GETDATE() jest taką funkcją, a DATEADD(..., constant, GETDATE()) jest również stałą czasu wykonywania. Pozostawiając rzeczywiste wywołanie funkcji w zapytaniu, pozwalasz optymalizatorowi zobaczyć, jaka wartość zostanie faktycznie użyta (w przeciwieństwie do wąchania wartości zmiennej), a następnie może odpowiednio dostosować swoje oszacowania kardynalności, być może wymyślając lepszy plan.

Przeczytaj także:Rozwiązywanie problemów ze słabą wydajnością zapytań:stałe składanie i ocena wyrażeń podczas szacowania kardynalności .

@Marcin Kowalski

Możesz uruchomić to zapytanie:

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;

W moim przypadku po 22 sekundach trafił w granicę i pętla wyszła. Ważną rzeczą jest to, że pętla została zakończona z @cnt zero . Można by się spodziewać, że jeśli getdate() jest oceniany na wiersz, wtedy otrzymalibyśmy @cnt różną od poprawnej @znanej liczby, ale nie 0. Fakt, że @cnt wynosi zero, gdy pętla istnieje, pokazuje każdą getdate() została oceniona raz, a następnie użyto tej samej stałej wartości dla każdego wiersza, GDZIE filtrowanie (brak dopasowania). Zdaję sobie sprawę, że jeden pozytywny przykład nie dowodzi twierdzenia, ale uważam, że sprawa jest wystarczająco rozstrzygająca.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to jest unikalne ograniczenie w SQL Server — SQL Server / samouczek TSQL, część 95

  2. Gdzie są przechowywane zarejestrowane serwery?

  3. Jak naprawić „Konwersja nie powiodła się podczas konwersji wartości na typ danych” w SQL Server

  4. Utwórz serwer połączony między dwoma kontenerami platformy Docker z uruchomionym programem SQL Server (przykład T-SQL)

  5. SqlParameter nie zezwala na nazwę tabeli - inne opcje bez ataku wstrzykiwania sql?