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:
- Frågan är mer läsbar (detta kommer nästan alltid att vara sant).
- Prestandan är förbättrad.
Och BÅDA av följande är sanna:
- Frågan ger semantiskt identiska resultat, och du kan visa detta genom tillräckliga regressionstestningar, inklusive alla kantfall.
- 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.