Wśród niektórych deweloperów programu SQL Server powszechnie NOT IN
panuje przekonanie, które jest strasznie powolne , a zapytania powinny być przepisywane tak, aby zwracały ten sam wynik, ale nie używały słów kluczowych „zło”. ( przykład ).
Czy jest w tym jakaś prawda?
Czy istnieje na przykład jakiś znany błąd w SQL Server (która wersja?), Który powoduje, że zapytania korzystają NOT IN
z gorszego planu wykonania niż równoważne zapytanie, które używa
- w
LEFT JOIN
połączeniu zNULL
czekiem lub (SELECT COUNT(*) ...) = 0
wWHERE
klauzuli?
sql-server
query-performance
except
Heinzi
źródło
źródło
IN
/NOT IN
zawsze będzie realizowany za pomocą zagnieżdżonych pętli. I nie mam pojęcia, costops SQL Server from creating a ‘plan’
to znaczy.Odpowiedzi:
Nie sądzę, żeby miało to coś wspólnego z byciem strasznie wolnym; ma to związek z potencjalnym niedokładnością. Na przykład, biorąc pod uwagę następujące dane - zamówienia, które mogą być składane przez klienta indywidualnego lub partnera B2B:
Powiedzmy, że chcę znaleźć wszystkich klientów, którzy nigdy nie złożyli zamówienia. Biorąc pod uwagę dane, jest tylko jeden: klient nr 2. Oto trzy sposoby pisania zapytania w celu znalezienia tych informacji (są inne):
Wyniki:
Teraz są też problemy z wydajnością i mówię o nich w tym poście na blogu . W zależności od danych i indeksów
NOT EXISTS
zwykle osiągają lepsze wynikiNOT IN
, a ja nie wiem, czy może kiedykolwiek gorzej. Należy również pamiętać, żeEXCEPT
można wprowadzić odrębną operację sortowania, co może skutkować uzyskaniem różnych danych (ponownie, w zależności od źródła). I że popularnyLEFT OUTER JOIN ... WHERE right.column IS NULL
wzór jest zawsze najgorszy.Martin Smith ma również wiele dobrych informacji pomocniczych w swojej odpowiedzi na temat SO .
źródło