sql >> Databasteknik >  >> RDS >> PostgreSQL

Prestandaskillnad:villkor placerat vid INNER JOIN vs WHERE-klausul

Anledningen till att du ser en skillnad beror på utförandeplanen som planeraren sätter ihop, detta är uppenbarligen olika beroende på frågan (förmodligen borde det vara att optimera de två frågorna för att vara samma och detta kan vara en bugg ). Det betyder att planeraren tror att den måste arbeta på ett speciellt sätt för att nå resultatet i varje påstående.

När du gör det inom JOIN, måste planeraren förmodligen välja från tabellen, filtrera efter "True"-delen och sedan gå med i resultatuppsättningarna. Jag kan tänka mig att det här är en stor tabell och därför mycket data att titta igenom, och den kan inte använda indexen lika effektivt.

Jag misstänker att om du gör det i en WHERE-klausul så väljer planeraren en rutt som är mer effektiv (dvs. antingen indexbaserad eller förfiltrerad datauppsättning).

Du kan förmodligen få sammanfogningen att fungera lika snabbt (om inte snabbare) genom att lägga till ett index på de två kolumnerna (osäker på om inkluderade kolumner och flera kolumnindex stöds på Postgres ännu).

Kort sagt, planeraren är problemet, den är att välja två olika vägar för att komma till resultatuppsättningarna, och den ena är inte lika effektiv som den andra. Det är omöjligt för oss att veta vad orsakerna är utan den fullständiga tabellinformationen och EXPLAIN ANALYZE informationen.

Om du vill ha detaljer om varför din specifika fråga gör detta, måste du ange mer information. Men anledningen är att planeraren väljer olika rutter.

Ytterligare läsmaterial:

http://www.postgresql.org/docs/current/static/explicit-joins.html

Skummade precis, verkar som att postgres-planeraren inte beställer om sammanfogningar för att optimera den. försök att ändra ordningen på sammanfogningarna i ditt uttalande för att se om du då får samma prestanda... bara en tanke.




  1. Fråga som returnerar en hierarkisk lista över triggerhändelsetyper i SQL Server

  2. Oracle DROP TABELL OM FINNS Alternativ

  3. Använd e-postadress som primärnyckel?

  4. Hur man ändrar datum- och tidsformat i MySQL