sql >> Database teknologi >  >> RDS >> Sqlserver

IN vs. JOIN med store rækkesæt

Opdatering:

Denne artikel i min blog opsummerer både mit svar og mine kommentarer til et andet svar og viser faktiske udførelsesplaner:

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

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

Disse forespørgsler er ikke ækvivalente. De kan give forskellige resultater, hvis din tabel b er ikke nøglebevaret (dvs. værdierne for b.d er ikke unikke).

Svaret til den første forespørgsel er følgende:

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

Hvis b.d er UNIQUE og markeret som sådan (med et UNIQUE INDEX eller UNIQUE CONSTRAINT ), så er disse forespørgsler identiske og vil sandsynligvis bruge identiske planer, da SQL Server er smart nok til at tage højde for dette.

SQL Server kan bruge en af ​​følgende metoder til at køre denne forespørgsel:

  • Hvis der er et indeks på a.c , d er UNIQUE og b er relativt lille sammenlignet med a , så spredes betingelsen ind i underforespørgslen og den almindelige INNER JOIN bruges (med b førende)

  • Hvis der er et indeks på b.d og d er ikke UNIQUE , så udbredes betingelsen også og LEFT SEMI JOIN anvendes. Den kan også bruges til ovenstående tilstand.

  • Hvis der er et indeks på begge b.d og a.c og de er store, så MERGE SEMI JOIN bruges

  • Hvis der ikke er noget indeks på nogen tabel, er en hash-tabel bygget på b og HASH SEMI JOIN bruges.

Ingen af ​​delene af disse metoder revurderer hele underforespørgslen hver gang.

Se dette indlæg i min blog for flere detaljer om, hvordan dette fungerer:

Der er links til alle RDBMS er af de fire store.



  1. opdater brugerlisten i gruppen:OPDATERING eller SLET + INDSÆT

  2. Udefineret funktion mysql_connect()

  3. Easysoft frigiver ODBC-ODBC Bridge til Windows 10

  4. Prisma relationer