2010-02-01 3 views
39

Badałem poprawę wydajności w szeregu procedur, a ostatnio kolega wspomniał, że osiągnął znaczną poprawę wydajności, wykorzystując INNER JOIN zamiast EXISTS.Czy INNER JOIN oferuje lepszą wydajność niż EXISTS

W ramach śledztwa, dlaczego tak się stało, pomyślałem, że zadaję tutaj pytanie.

Więc:

  • Czy INNER JOIN oferują lepszą wydajność niż istnieje?
  • Jakie są tego okoliczności?
  • W jaki sposób mogę skonfigurować test jako dowód?
  • Czy masz przydatne linki do dalszej dokumentacji?

Naprawdę, każde inne doświadczenie, które ludzie mogą wnieść w tym pytaniu.

Byłbym wdzięczny, gdyby jakiekolwiek odpowiedzi były w stanie odpowiedzieć na to pytanie, bez sugestii co do innych możliwych ulepszeń wydajności. Odnieśliśmy już spory sukces i właśnie interesowałem się tym jednym przedmiotem.

Każda pomoc będzie mile widziana.

Odpowiedz

39

Ogólnie rzecz biorąc, INNER JOIN i EXISTS to różne rzeczy.

Pierwszy z nich zwraca duplikaty i kolumny z obu tabel, drugi zwraca jeden rekord, a będąc predykatem zwraca rekordy tylko z jednej tabeli.

Jeśli wykonasz sprzężenie wewnętrzne na kolumnie UNIQUE, wykazują one taką samą wydajność.

Jeśli wykonujesz wewnętrzne sprzężenie na zestawie rekordów z zastosowanym DISTINCT (w celu pozbycia się duplikatów), EXISTS jest zwykle szybsze.

IN i EXISTS klauzule (z korelacji equijoin) zwykle wykorzystują jeden z kilku SEMI JOIN algorytmów, które są zwykle bardziej skuteczne niż DISTINCT na jednej z tabel.

Zobacz ten artykuł na moim blogu:

+1

To trochę off topic, ale chciałbym sugeruj unikanie DISTINCT i korzystaj z GROUP BY, aby uzyskać ogólną lepszą wydajność przy zwracaniu różnych list. DISTINCT nie działa tak dobrze jak GROUP BY w ogóle. Może to również pomóc w odrobinie różnicy między INNER JOIN i EXISTS. – EricI

+4

@EricI: czy mógłbyś podać przykład zapytania, które jest mniej efektywne przy użyciu "DISTINCT" niż "GROUP BY", pod warunkiem, że dane wyjściowe są identyczne? Dzięki! – Quassnoi

7

Może tak, może nie.

  • Ten sam plan zostanie wygenerowany najprawdopodobniej
  • sprzężenie wewnętrzne mogą wymagać odrębnego, aby uzyskać taki sam efekt
  • istnieje oferty z NULL