PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dlaczego najbardziej naturalne zapytanie (tj. użycie INNER JOIN (zamiast LEFT JOIN)) jest bardzo wolne

(zgodnie z zaleceniami umieszczam część mojego komentarza w odpowiedzi, ponieważ rozwiązało to problem)

Przekształć wyrażenia EXISTS na wyrażenia IN.

W tym przypadku działa to lepiej, ponieważ zapytanie będzie teraz efektywnie oceniane „od środka”, zaczynając od zapytania, które zawiera najbardziej ograniczający czynnik:wyszukiwanie pełnotekstowe. Zapytanie to zwróci mały zestaw wierszy, które można wyszukać bezpośrednio względem klucza podstawowego zapytania zewnętrznego (WHERE x in (SELECT X...)) w przeciwieństwie do wywoływania zapytania „wewnętrznego” raz na wartość zewnętrzne zapytanie (lub dla wszystkich wartości w oryginalnym przypadku, jeśli dobrze czytam). Metoda EXISTS w tym przypadku daje w wyniku zagnieżdżone pętle (jedna ocena jednego zapytania dla każdej wartości w innej) w porównaniu z metodą IN przy użyciu złączeń mieszających (znacznie wydajniejsza metoda wykonywania w wielu, jeśli nie w większości przypadków).

Zwróć uwagę, że w przypadku metody EXISTS istnieją cztery zagnieżdżone pętle, które są wykonywane, z których każda działa co najmniej 3000 razy. Ten koszt się sumuje. Chociaż nie jest to bezpośrednie porównanie, możesz traktować pętle zagnieżdżone tak, jak pętle FOR w kodzie aplikacji:za każdym razem, gdy wywołujesz pętlę wewnętrzną, twoje oszacowanie dużego O rośnie o rząd wielkości:O(n) do O(n^ 2) do O(n^3) itd.

Hash Join jest bardziej podobny do mapy, w której dwie tablice są przeszukiwane w tym samym czasie i na obu wykonywana jest operacja. Jest to z grubsza liniowe (O(n)). Pomyśl o tym, że są one zagnieżdżone jako addytywne, aby przejść od O(n) do O(2n) do O(3n) itd.

Tak, tak, wiem, że to nie to samo, ale chodzi o to, że posiadanie wielu zagnieżdżonych pętli zwykle wskazuje na powolny plan zapytania, a porównanie dwóch stylów big-O ułatwia rozpoznanie, jak sądzę.

Zagnieżdżone pętle i ISTNIEJE same w sobie nie są złe, ale w większości przypadków istnieje podstawowy warunek filtrowania, który ostatecznie wpływa na wszystko (na przykład wyszukiwanie pełnotekstowe w pytaniu), wyrażenie IN (lub, w niektóre przypadkach, prawidłowe JOIN) daje znacznie bardziej wydajny 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. Jak wyszukiwać w polu json zawierającym tablicę obiektów za pomocą Eloquent

  2. Wyzwalacz wstawiania wierszy do zdalnej bazy danych po usunięciu

  3. Jaki typ danych dla szerokości i długości geograficznej?

  4. Jak wyświetlić listę aktywnych połączeń w PostgreSQL?

  5. Jak zmapować wyliczenie PostgreSQL za pomocą JPA i Hibernate?