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

Dwie selekcje czy jedna selekcja + jedno sprzężenie w SQL?

Twój pogląd, że powinni wykonywać tę samą pracę, nie jest prawdziwy. Wyobraź sobie ten testowy zestaw danych:

T1

ID
----
1
2
3
4
5

T2

ID
---
1
1
1
2
2
3

DDL

CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (1), (1), (2), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

Wyniki

ID
---
1
2
3

ID
---
1
1
1
2
2
3

Twoje wyniki są takie same tylko wtedy, gdy kolumna, w której szukasz, jest unikalna.

CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

Mimo że wyniki są takie same, plan wykonania nie. Pierwsze zapytanie używające IN potrafi użyć antysemi join, co oznacza, że ​​wie, że dane w t2 nie są potrzebne, więc gdy tylko znajdzie pojedyncze dopasowanie, może przestać szukać dalszych dopasowań.

Jeśli ograniczysz swoją drugą tabelę tak, aby zawierała tylko unikalne wartości, zobaczysz ten sam plan:

CREATE TABLE dbo.T1 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

Podsumowując, te dwa zapytania nie zawsze przyniosą te same wyniki i nie zawsze będą miały ten sam plan. To naprawdę zależy od twoich indeksów i szerokości twoich danych/zapytań.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zmiana kolejności i deduplikacja kolumn SQL na podstawie danych kolumn

  2. SqlException był nieobsługiwany

  3. Wybór N wierszy w SQL Server

  4. Wydajność serwera SQL — testowanie w chmurze

  5. [Sql-Server] jakiego typu danych użyć dla wartości soli hasła i wartości skrótu i ​​jakiej długości?