Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

IN vs. JOIN z dużymi zestawami rzędów

Aktualizacja:

Ten artykuł na moim blogu podsumowuje zarówno moją odpowiedź, jak i komentarze do innych odpowiedzi, a także pokazuje rzeczywiste plany wykonania:

SELECT  *
FROM    a
WHERE   a.c IN (SELECT d FROM b)

SELECT  a.*
FROM    a
JOIN    b
ON      a.c = b.d

Te zapytania nie są równoważne. Mogą dawać różne wyniki, jeśli Twoja tabela b nie jest zachowywany klucz (tzn. wartości b.d nie są unikalne).

Odpowiednikiem pierwszego zapytania jest:

SELECT  a.*
FROM    a
JOIN    (
        SELECT  DISTINCT d
        FROM    b
        ) bo
ON      a.c = bo.d

Jeśli b.d jest UNIQUE i oznaczony jako taki (z UNIQUE INDEX lub UNIQUE CONSTRAINT ), to te zapytania są identyczne i najprawdopodobniej będą korzystać z identycznych planów, ponieważ SQL Server jest wystarczająco sprytny, aby wziąć to pod uwagę.

SQL Server może użyć jednej z następujących metod do uruchomienia tego zapytania:

  • Jeśli istnieje indeks na a.c , d jest UNIQUE i b jest stosunkowo mały w porównaniu do a , warunek jest propagowany do podzapytania i zwykłego INNER JOIN jest używany (z b wiodący)

  • Jeśli istnieje indeks na b.d i d nie jest UNIQUE , warunek jest również propagowany i LEFT SEMI JOIN jest używany. Może być również użyty do powyższego warunku.

  • Jeśli istnieje indeks na obu b.d i a.c i są duże, to MERGE SEMI JOIN jest używany

  • Jeśli nie ma indeksu w żadnej tabeli, tablica mieszająca jest budowana na b i HASH SEMI JOIN jest używany.

Ani z tych metod za każdym razem ponownie ocenia całe podzapytanie.

Zobacz ten wpis na moim blogu, aby uzyskać więcej informacji na temat tego, jak to działa:

Istnieją linki do wszystkich RDBMS z wielkiej czwórki.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ukrywanie baz danych do logowania w Microsoft Sql Server 2008R2 i nowszych

  2. Sortowanie zawsze zwraca ten sam wynik

  3. Tymczasowe wyłączenie ograniczeń (MS SQL)

  4. Eliminacja przyłączeń:gdy SQL Server usuwa niepotrzebne tabele

  5. Serwer SQL — Unikaj odroczonej kompilacji