Няма начин някой да ви каже това EXCEPT винаги или никога ще превъзхожда еквивалентен OUTER JOIN . Оптимизаторът ще избере подходящ план за изпълнение, независимо от това как пишете намерението си.
Въпреки това, ето моята насока:
Използвайте EXCEPT когато поне един от следното е вярно:
- Заявката е по-четлива (това почти винаги е вярно).
- Ефективността е подобрена.
И ДВЕТЕ от следните са верни:
- Заявката дава семантично идентични резултати и можете да демонстрирате това чрез достатъчно регресионно тестване, включително всички крайни случаи.
- Ефективността не се влошава (отново във всички крайни случаи, както и промени в околната среда, като изчистване на буферния пул, актуализиране на статистиката, изчистване на кеша на плана и рестартиране на услугата).
Важно е да се отбележи, че може да бъде предизвикателство да се напише еквивалентен EXCEPT заявка като JOIN става по-сложен и/или разчитате на дубликати в част от колоните, но не и на други. Написване на NOT EXISTS еквивалентен, но малко по-малко четим от EXCEPT трябва да бъде много по-тривиално за изпълнение - и често води до по-добър план (но имайте предвид, че никога не бих казал ALWAYS или NEVER , освен по начина, по който току-що го направих).
В тази публикация в блога демонстрирам поне един случай, когато EXCEPT се превъзхожда както от правилно изграденото LEFT OUTER JOIN и разбира се чрез еквивалентен NOT EXISTS вариация.