V žádném případě vám to nikdo nemůže říct EXCEPT
bude vždy nebo nikdy překonávat ekvivalentní OUTER JOIN
. Optimalizátor vybere vhodný plán provádění bez ohledu na to, jak napíšete svůj záměr.
To znamená, že zde je můj pokyn:
Použijte EXCEPT
když alespoň jeden platí následující:
- Dotaz je čitelnější (to bude téměř vždy pravda).
- Výkon se zlepšil.
A OBA platí:
- Dotaz poskytuje sémanticky identické výsledky a můžete to prokázat dostatečným regresním testováním, včetně všech okrajových případů.
- Výkon není snížen (opět ve všech okrajových případech, stejně jako změny prostředí, jako je vymazání fondu vyrovnávacích pamětí, aktualizace statistik, vymazání mezipaměti plánu a restartování služby).
Je důležité si uvědomit, že napsat ekvivalent EXCEPT
může být problém zadejte dotaz jako JOIN
se stává složitější a/nebo spoléháte na duplikáty v části sloupců, ale ne v jiných. Zápis NOT EXISTS
ekvivalentní, i když je o něco méně čitelný než EXCEPT
by mělo být mnohem triviálnější – a často to povede k lepšímu plánu (ale mějte na paměti, že bych nikdy neřekl ALWAYS
nebo NEVER
, kromě toho, jak jsem to právě udělal).
V tomto blogovém příspěvku demonstruji alespoň jeden případ, kdy EXCEPT
je překonán jak správně zkonstruovaným LEFT OUTER JOIN
a samozřejmě ekvivalentem NOT EXISTS
variace.