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

Wyjaśnij bardziej szczegółowo sugestię dotyczącą wydajności warunku JOIN vs. LEFT JOIN i WHERE

W rzeczywistości WHERE warunki i JOIN warunki dla [INNER] JOIN są w 100% równoważne w PostgreSQL. (Dobrą praktyką jest użycie jawnego JOIN warunki ułatwiające czytanie i obsługę zapytań).

To samo nie true dla LEFT JOIN w połączeniu z WHERE warunek na stole po prawej stronie sprzężenia. Cel LEFT JOIN jest zachowanie wszystkich wierszy po lewej stronie sprzężenia, niezależnie od dopasowania po prawej stronie. Jeśli nie zostanie znalezione żadne dopasowanie, wiersz jest rozszerzany o NULL wartości dla kolumn po prawej stronie. Instrukcja:

LEFT OUTER JOIN

Najpierw wykonywane jest sprzężenie wewnętrzne. Następnie dla każdego wiersza w T1, który nie spełnia warunku sprzężenia z żadnym wierszem w T2, dodawany jest połączony wiersz z wartościami null w kolumnach T2. Tak więc połączone tabele zawsze mają co najmniej jeden wiersz na każdy wiersz w T1.

Jeśli następnie zastosujesz WHERE warunek, który wymaga czegoś innego niż NULL wartość w kolumnach tabel po prawej stronie, unieważniasz efekt i wymuszasz konwersję LEFT [OUTER] JOIN działać jak zwykły [INNER] JOIN , po prostu (prawdopodobnie) drożej ze względu na bardziej skomplikowany plan zapytań.

W zapytaniu z wieloma połączonymi tabelami Postgres (lub dowolny RDBMS) jest trudny do znalezienia najlepszego (lub nawet dobrego) planu zapytań. Liczba teoretycznie możliwych sekwencji do łączenia tabel rośnie czynnikowo (!). Postgres używa do tego zadania „Generic Query Optimizer” i istnieją pewne ustawienia, które mają na to wpływ.

Zaciemnianie zapytania za pomocą wprowadzającego w błąd LEFT JOIN jak wspomniano, utrudnia pracę planerowi zapytań, wprowadza w błąd czytelników i zazwyczaj wskazuje na błędy w logice zapytań.

Powiązane odpowiedzi na problemy wynikające z tego:

  • Dlaczego null równa się liczba całkowita w WHERE?
  • Zapytanie z LEFT JOIN nie zwraca wierszy dla liczby 0
  • Kwerenda SQL wykorzystująca sprzężenie zewnętrzne i ograniczenie rekordów podrzędnych dla każdego rodzica
  • Lewe sprzężenie zewnętrzne działające jak sprzężenie wewnętrzne
  • Wybierz wiersze, których nie ma w innej tabeli

Itd.



  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 sprawdzić stan serwera PostgreSQL Mac OS X?

  2. Wiele CTE w jednym zapytaniu

  3. Jak Asind() działa w PostgreSQL

  4. Przegląd przetwarzania VACUUM w PostgreSQL

  5. Typecast string to integer