sql >> Databasteknik >  >> RDS >> Sqlserver

EXCEPT körs snabbare än en JOIN när tabellkolumnerna är desamma

Det finns inget sätt någon kan berätta för dig det EXCEPT kommer alltid eller aldrig att överträffa en motsvarande OUTER JOIN . Optimeraren kommer att välja en lämplig utförandeplan oavsett hur du skriver din avsikt.

Som sagt, här är min riktlinje:

Använd EXCEPT när minst en av följande är sant:

  1. Frågan är mer läsbar (detta kommer nästan alltid att vara sant).
  2. Prestandan är förbättrad.

Och BÅDA av följande är sanna:

  1. Frågan ger semantiskt identiska resultat, och du kan visa detta genom tillräckliga regressionstestningar, inklusive alla kantfall.
  2. Prestandan försämras inte (igen, i alla edge-fall, såväl som miljöförändringar som att rensa buffertpoolen, uppdatera statistik, rensa planens cache och starta om tjänsten).

Det är viktigt att notera att det kan vara en utmaning att skriva en motsvarande EXCEPT fråga som JOIN blir mer komplex och/eller du förlitar dig på dubbletter i delar av kolumnerna men inte andra. Att skriva en NOT EXISTS likvärdig, medan något mindre läsbar än EXCEPT borde vara mycket mer trivialt att genomföra - och kommer ofta att leda till en bättre plan (men observera att jag aldrig skulle säga ALWAYS eller NEVER , förutom på det sätt jag precis gjorde).

I det här blogginlägget visar jag minst ett fall där EXCEPT överträffas av både en korrekt konstruerad LEFT OUTER JOIN och naturligtvis av en motsvarande NOT EXISTS variation.



  1. Kontrollera om sekvensen finns i Postgres (plpgsql)

  2. PostgreSQL tabellvariabel

  3. Introduktion till PL/SQL-undantagshantering i Oracle Database

  4. Juli 2016 PSU misslyckas med att göra isqora