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

Jak wymusić wykonanie podzapytania równie dobrze jak tabela #temp?

Istnieje kilka możliwych wyjaśnień, dlaczego widzisz takie zachowanie. Niektóre popularne to

  1. Podzapytanie lub CTE mogą być wielokrotnie ponownie oceniane.
  2. Materiałyzacja częściowych wyników w #temp tabela może wymusić bardziej optymalną kolejność łączenia dla tej części planu, usuwając niektóre możliwe opcje z równania.
  3. Materiałyzacja częściowych wyników w #temp tabela może poprawić resztę planu poprzez skorygowanie słabych szacunków kardynalności.

Najbardziej niezawodną metodą jest po prostu użycie #temp stół i zmaterializuj go samodzielnie.

W przypadku braku tego w odniesieniu do punktu 1 zobacz Podaj wskazówkę, aby wymusić pośrednią materializację CTE lub tabel pochodnych . Użycie TOP(large_number) ... ORDER BY często może zachęcać wynik do buforowania zamiast wielokrotnego ponownego oceniania.

Nawet jeśli to działa, nie ma statystyk na szpuli.

W przypadku punktów 2 i 3 musiałbyś przeanalizować, dlaczego nie otrzymywałeś pożądanego planu. Ewentualnie przepisanie zapytania w celu użycia predykatów sargable lub zaktualizowanie statystyk może uzyskać lepszy plan. Niepowodzenie, że możesz spróbować użyć wskazówek dotyczących zapytania, aby uzyskać pożądany plan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Maksymalny rozmiar zmiennej SQL Server 2008 R2

  2. TABLOCK vs TABLOCKX

  3. Jak korzystać z licznika i grupowania według z dołączeniem Self w tej samej tabeli w serwerze sql 2008?

  4. java.sql.SQLException:nie znaleziono odpowiedniego sterownika dla jdbc:microsoft:sqlserver

  5. Plany SQL Server:różnica między skanowaniem indeksu / wyszukiwaniem indeksu