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

Dlaczego CTE (Common Table Expressions) w niektórych przypadkach spowalnia zapytania w porównaniu do tabel tymczasowych w SQL Server

Odpowiedź jest prosta.

SQL Server nie realizuje CTE. Zawiera je, jak widać z planów wykonania.

Inne DBMS mogą zaimplementować to inaczej, dobrze znanym przykładem jest Postgres, który materializuje CTE (zasadniczo tworzy tymczasowe tabele CTE za maską).

To, czy jawna materializacja wyników pośrednika w jawnych tabelach tymczasowych jest szybsza, zależy od zapytania.

W złożonych zapytaniach narzut związany z zapisem i odczytem danych pośrednich do tabel tymczasowych może zostać zrekompensowany przez wydajniejsze, prostsze plany wykonania, które optymalizator jest w stanie wygenerować.

Z drugiej strony w Postgres CTE jest „ogrodzeniem optymalizacji”, a silnik nie może przepychać predykatów poza granicę CTE.

Czasem jeden sposób jest lepszy, czasem inny. Gdy złożoność zapytania przekroczy pewien próg, optymalizator nie może przeanalizować wszystkich możliwych sposobów przetwarzania danych i musi się na czymś poprzestać. Na przykład kolejność łączenia stołów. Liczba permutacji rośnie wykładniczo wraz z liczbą tabel do wyboru. Optymalizator ma ograniczony czas na wygenerowanie planu, więc może być złym wyborem, gdy wszystkie CTE są uwzględnione. Kiedy ręcznie dzielisz złożone zapytania na mniejsze, prostsze, musisz zrozumieć, co robisz, ale optymalizator ma większą szansę na wygenerowanie dobrego planu dla każdego prostego zapytania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Do czego służą nawiasy kwadratowe [] w instrukcjach sql?

  2. Jak poznać wartość wiersza przed jego wstawieniem do gridview?

  3. używanie funkcji Object_id() z #tables

  4. Jak połączyć serwer sql z php za pomocą xampp?

  5. Co to jest Multi Dimension OLAP CUBE i podaj przykładową kostkę z więcej niż 3 wymiarami