sql >> Databasteknik >  >> RDS >> PostgreSQL

Förklara JOIN vs. LEFT JOIN och WHERE-förslag till prestanda mer detaljerat

Effektivt, WHERE villkor och JOIN villkor för [INNER] JOIN motsvarar 100 % i PostgreSQL. (Det är god praxis att använda explicit JOIN villkor för att göra frågor lättare att läsa och underhålla.

Detsamma är inte sant för en LEFT JOIN kombinerat med en WHERE skick på en tabell till höger om sammanfogningen. Syftet med en LEFT JOIN är att bevara alla rader på vänster sida av sammanfogningen, oavsett en matchning på höger sida. Om ingen matchning hittas utökas raden med NULL värden för kolumner på höger sida. Manualen:

LEFT OUTER JOIN

Först utförs en inre sammanfogning. Sedan, för varje rad i T1 som inte uppfyller kopplingsvillkoret med någon rad i T2, läggs en sammanfogad rad till med nollvärden i kolumner i T2. Således har de sammanfogade tabellerna alltid minst en rad för varje rad i T1.

Om du sedan använder en WHERE villkor som kräver något annat än en NULL värde på kolumner av tabeller på höger sida, annullerar du effekten och tvångskonverterar LEFT [OUTER] JOIN att fungera som en vanlig [INNER] JOIN , bara (möjligen) dyrare på grund av en mer komplicerad frågeplan.

I en fråga med många sammanfogade tabeller är Postgres (eller något RDBMS) svårt att hitta den bästa (eller till och med en bra) frågeplan. Antalet teoretiskt möjliga sekvenser för att sammanfoga tabeller växer faktoriellt (!). Postgres använder "Generic Query Optimizer" för uppgiften och det finns några inställningar för att påverka den.

Förvirrar frågan med vilseledande LEFT JOIN som beskrivs, gör frågeplanerarens arbete svårare, är vilseledande för mänskliga läsare och antyder vanligtvis fel i frågelogiken.

Relaterade svar för problem som härrör från detta:

  • Varför är null lika med heltal i WHERE?
  • Fråga med LEFT JOIN returnerar inte rader för antalet 0
  • SQL-fråga som använder yttre koppling och begränsande underordnade poster för varje förälder
  • Vänster yttre sammanfogning fungerar som en inre sammanfogning
  • Välj rader som inte finns i andra tabeller

Etc.



  1. Parallel Go-tester utförda mot en PostgreSQL-databas som körs på Docker

  2. PG::Fel:SELECT DISTINCT, ORDER BY-uttryck måste visas i urvalslistan

  3. Infoga en array med Sequel gem i PostgreSQL

  4. MariaDB SCHEMA() Förklarat