Niemand kan je dat vertellen EXCEPT
zal altijd of nooit beter presteren dan een gelijkwaardige OUTER JOIN
. De optimizer kiest een geschikt uitvoeringsplan, ongeacht hoe u uw intentie schrijft.
Dat gezegd hebbende, hier is mijn richtlijn:
Gebruik EXCEPT
wanneer minstens één van het volgende is waar:
- De zoekopdracht is beter leesbaar (dit zal bijna altijd waar zijn).
- Prestaties zijn verbeterd.
En BEIDE van de volgende zijn waar:
- De zoekopdracht levert semantisch identieke resultaten op en u kunt dit aantonen door middel van voldoende regressietests, inclusief alle randgevallen.
- De prestaties zijn niet verslechterd (nogmaals, in alle edge-gevallen, evenals veranderingen in de omgeving, zoals het wissen van de bufferpool, het bijwerken van statistieken, het wissen van de plancache en het opnieuw starten van de service).
Het is belangrijk op te merken dat het een uitdaging kan zijn om een equivalent EXCEPT
. te schrijven query als de JOIN
wordt complexer en/of u vertrouwt op duplicaten in een deel van de kolommen, maar niet op andere. Schrijven van een NOT EXISTS
equivalent, hoewel iets minder leesbaar dan EXCEPT
zou veel trivialer moeten zijn om te bereiken - en zal vaak leiden tot een beter plan (maar merk op dat ik nooit zou zeggen ALWAYS
of NEVER
, behalve op de manier waarop ik dat net deed).
In deze blogpost demonstreer ik ten minste één geval waarin EXCEPT
wordt overtroffen door zowel een goed geconstrueerde LEFT OUTER JOIN
en natuurlijk door een equivalent NOT EXISTS
variatie.