Nikt nie może ci powiedzieć, że EXCEPT
zawsze lub nigdy nie przewyższy równoważnego OUTER JOIN
. Optymalizator wybierze odpowiedni plan wykonania niezależnie od tego, jak napiszesz swoją intencję.
To powiedziawszy, oto moja wskazówka:
Użyj EXCEPT
kiedy co najmniej jeden z poniższych jest prawdziwe:
- Zapytanie jest bardziej czytelne (prawie zawsze będzie to prawda).
- Poprawa wydajności.
I OBU z poniższych są prawdziwe:
- Zapytanie daje semantycznie identyczne wyniki i możesz to zademonstrować za pomocą wystarczających testów regresji, w tym wszystkich przypadków brzegowych.
- Wydajność nie jest obniżona (ponownie, we wszystkich przypadkach brzegowych, a także w przypadku zmian środowiskowych, takich jak czyszczenie puli buforów, aktualizowanie statystyk, czyszczenie pamięci podręcznej planu i ponowne uruchamianie usługi).
Należy pamiętać, że napisanie odpowiednika EXCEPT
. może być wyzwaniem zapytanie jako JOIN
staje się bardziej złożony i/lub polegasz na duplikatach w części kolumn, ale nie w innych. Pisanie NOT EXISTS
równoważny, choć nieco mniej czytelny niż EXCEPT
powinno być o wiele bardziej trywialne do wykonania - i często prowadzi do lepszego planu (ale zauważ, że nigdy nie powiedziałbym ALWAYS
lub NEVER
, z wyjątkiem tego, co właśnie zrobiłem).
W tym poście na blogu pokazuję co najmniej jeden przypadek, w którym EXCEPT
jest lepszy od prawidłowo skonstruowanego LEFT OUTER JOIN
i oczywiście przez odpowiednik NOT EXISTS
odmiana.