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