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

PostgreSQL:Użycie instrukcji AND w LEFT JOIN nie działa zgodnie z oczekiwaniami

Zamieszanie wokół LEFT JOIN i WHERE klauzula była wielokrotnie wyjaśniana:

To interesujące pytanie pozostaje:

W Postgresie nie ma wyraźnych wskazówek dotyczących zapytań. (Co jest przedmiotem toczącej się debaty). Ale wciąż istnieją różne sztuczki, które sprawią, że Postgres pochyli się na twojej drodze.

Ale najpierw zadaj sobie pytanie: Dlaczego planer zapytań oszacował, że wybrany plan jest na początku tańszy? Czy konfiguracja twojego serwera jest w zasadzie rozsądna? Czy ustawienia kosztów są odpowiednie? autovacuum działanie? Wersja Postgresa jest nieaktualna? Czy rozwiązujesz podstawowy problem, który naprawdę powinien zostać naprawiony?

Jeśli zmusisz Postgresa, aby zrobił to po swojemu, powinieneś mieć pewność, że nie odpali się po aktualizacji wersji lub aktualizacji konfiguracji serwera ... Lepiej wiedzieć, co dokładnie robisz.

To powiedziawszy, możesz zmusić Postgres do "odfiltrowania niektórych rekordów przed wykonaniem JOIN z podzapytaniem, w którym dodajesz OFFSET 0 - co logicznie jest tylko szumem, ale zapobiega przekształceniu go przez Postgres w formę zwykłego sprzężenia. (W końcu podpowiedź do zapytania)

SELECT la.listing_id, la.id, lar.*
FROM  (
   SELECT listing_id, id
   FROM   la
   WHERE  listing_id = 2780
   OFFSET 0
   ) la
LEFT   JOIN lar  ON lar.application_id = la.id;

Możesz też użyć CTE (mniej niejasny, ale droższy). Lub inne sztuczki, takie jak ustawianie pewnych parametrów konfiguracyjnych. Lub, w tym konkretnym przypadku, użyłbym LATERAL dołącz do tego samego efektu:

SELECT la.listing_id, la.id, lar.*
FROM   la
LEFT  JOIN LATERAL (
   SELECT *
   FROM   lar
   WHERE  application_id = la.id
   )  lar ON true
WHERE  la.listing_id = 2780;

Powiązane:

Oto obszerny blog na temat wskazówek dotyczących zapytań autorstwa 2ndQuadrant. Pięć lat, ale nadal ważny.



  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 stworzyć użytkownika w PostgreSQL

  2. Jak poprawnie zrobić upsert w postgresie 9.5

  3. Postgres - KRYTYCZNY:pliki bazy danych są niezgodne z serwerem

  4. dowolny sposób na tworzenie sparametryzowanych zapytań i enkapsulację pythona w funkcji

  5. Hibernate Postgresql wybierz do aktualizacji z problemem połączenia zewnętrznego