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

Czy istnieje różnica w wydajności między CTE , podzapytaniem, tabelą tymczasową lub zmienną tabelową?

SQL jest językiem deklaratywnym, a nie proceduralnym. Oznacza to, że tworzysz instrukcję SQL, aby opisać żądane wyniki. Nie mówisz silnikowi SQL jak wykonać pracę.

Zasadniczo dobrym pomysłem jest umożliwienie silnikowi SQL i optymalizatorowi SQL znalezienie najlepszego planu zapytań. Opracowanie silnika SQL wymaga wielu osobo-lat wysiłku, więc pozwól inżynierom robić to, co potrafią.

Oczywiście zdarzają się sytuacje, w których plan zapytania nie jest optymalny. Następnie chcesz użyć wskazówek dotyczących zapytań, zmienić strukturę zapytania, zaktualizować statystyki, użyć tabel tymczasowych, dodać indeksy itd., aby uzyskać lepszą wydajność.

Co do twojego pytania. Wydajność CTE i podzapytań powinna teoretycznie być taka sama, ponieważ oba dostarczają te same informacje do optymalizatora zapytań. Jedną z różnic jest to, że CTE użyty więcej niż jeden raz można łatwo zidentyfikować i obliczyć raz. Wyniki można następnie wielokrotnie przechowywać i odczytywać. Niestety, wydaje się, że SQL Server nie wykorzystuje tej podstawowej metody optymalizacji (można nazwać to eliminacją podzapytania).

Tabele tymczasowe to inna sprawa, ponieważ dostarczasz więcej wskazówek dotyczących sposobu uruchamiania zapytania. Jedną z głównych różnic jest to, że optymalizator może używać statystyk z tabeli tymczasowej do ustalenia planu zapytań. Może to spowodować wzrost wydajności. Ponadto, jeśli masz skomplikowane CTE (podzapytanie), które jest używane więcej niż jeden raz, przechowywanie go w tabeli tymczasowej często zwiększa wydajność. Zapytanie jest wykonywane tylko raz.

Odpowiedź na Twoje pytanie jest taka, że ​​musisz się pobawić, aby uzyskać oczekiwaną wydajność, szczególnie w przypadku złożonych zapytań, które są uruchamiane regularnie. W idealnym świecie optymalizator zapytań znalazłby idealną ścieżkę wykonania. Chociaż często tak się dzieje, możesz znaleźć sposób na uzyskanie lepszej wydajności.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rozróżnianie wielkości liter w Postgres

  2. Jak działa OBJECTPROPERTY() w SQL Server

  3. SYSDATETIME() vs GETDATE() w SQL Server:jaka jest różnica?

  4. Jak dodać AM/PM do wartości czasu w SQL Server (T-SQL)

  5. Wymień SQL Server, usuń wszystko po określonym znaku