Der er ingen måde, nogen kan fortælle dig det EXCEPT
vil altid eller aldrig udkonkurrere en tilsvarende OUTER JOIN
. Optimizeren vil vælge en passende eksekveringsplan, uanset hvordan du skriver din hensigt.
Når det er sagt, her er min retningslinje:
Brug EXCEPT
når mindst én af følgende er sandt:
- Forespørgslen er mere læsbar (dette vil næsten altid være sandt).
- Ydeevnen er forbedret.
Og BEGGE af følgende er sande:
- Forespørgslen producerer semantisk identiske resultater, og du kan demonstrere dette gennem tilstrækkelig regressionstest, inklusive alle kanttilfælde.
- Ydeevnen forringes ikke (igen, i alle edge-tilfælde, såvel som miljøændringer, såsom rydning af bufferpuljen, opdatering af statistik, rydning af planens cache og genstart af tjenesten).
Det er vigtigt at bemærke, at det kan være en udfordring at skrive en tilsvarende EXCEPT
forespørgsel som JOIN
bliver mere kompleks, og/eller du er afhængig af dubletter i en del af kolonnerne, men ikke andre. At skrive en FINDER IKKE tilsvarende, mens den er lidt mindre læsbar end
EXCEPT
burde være langt mere trivielt at opnå - og vil ofte føre til en bedre plan (men bemærk, at jeg aldrig ville sige ALTID
eller ALDRIG
, undtagen på den måde, jeg lige gjorde).
I dette blogindlæg demonstrerer jeg mindst ét tilfælde, hvor EXCEPT
er bedre end både en korrekt konstrueret LEFT OUTER JOIN
og selvfølgelig af en tilsvarende EKSISTERER IKKE
variation.