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

wybór operatora optymalizatora zapytań - pętle zagnieżdżone vs dopasowanie hash (lub scalanie)

ABSOLUTNIE. Hash match byłby ogromną poprawą. Tworzenie skrótu w mniejszej tabeli 19 223 wierszy, a następnie sondowanie jej za pomocą większej tabeli 65 991 wierszy jest znacznie mniejszą operacją niż zagnieżdżona pętla wymagająca porównania 1 268 544 993 wierszy.

Jedynym powodem, dla którego serwer wybrałby zagnieżdżone pętle, jest to, że źle oszacował liczbę zaangażowanych wierszy. Czy Twoje tabele zawierają statystyki, a jeśli tak, to czy są one regularnie aktualizowane? Statystyki umożliwiają serwerowi wybór dobrych planów wykonania.

Jeśli prawidłowo zajęłeś się statystykami i nadal masz problem, możesz zmusić go do użycia połączenia HASH w następujący sposób:

SELECT *
FROM
   TableA A -- The smaller table
   LEFT HASH JOIN TableB B -- the larger table

Pamiętaj, że gdy to zrobisz, wymusi to również kolejność dołączania. Oznacza to, że musisz poprawnie ułożyć wszystkie stoły, aby ich kolejność łączenia miała sens. Ogólnie rzecz biorąc, należy sprawdzić plan wykonania, który serwer już posiada, i zmienić kolejność tabel w zapytaniu, aby była zgodna. Jeśli nie wiesz, jak to zrobić, podstawa jest taka, że ​​każde „lewe” wejście jest pierwsze, a w graficznych planach wykonania lewe wejście jest dolne jeden. Złożone sprzężenie obejmujące wiele tabel może wymagać grupowania sprzężeń razem w nawiasach lub użycia RIGHT JOIN aby plan wykonania był optymalny (zamień lewe i prawe dane wejściowe, ale wprowadź tabelę we właściwym miejscu w kolejności łączenia).

Generalnie najlepiej jest unikać używania wskazówek dotyczących łączenia i wymuszania kolejności łączenia, więc najpierw zrób wszystko, co możesz! Możesz zajrzeć do indeksów w tabelach, fragmentacji, zmniejszenia rozmiarów kolumn (takich jak użycie varchar zamiast nvarchar gdzie Unicode nie jest wymagany) lub dzielenie zapytania na części (najpierw wstaw do tabeli tymczasowej, a następnie dołącz do niej).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wykonywanie procedury składowanej przy użyciu Harmonogramu zadań systemu Windows

  2. Jak opisać tabelę w SQL Server 2008?

  3. Jak rozszerzyć wartości oddzielone przecinkami do oddzielnych wierszy przy użyciu programu SQL Server 2005?

  4. Wykonaj sp_executeSql, aby wybrać...do #table, ale nie można wybrać danych tabeli tymczasowej

  5. TSQL Zaokrągla liczbę dziesiętną w górę