Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Hai lựa chọn hay một lựa chọn + một tham gia trong SQL?

Quan niệm của bạn rằng họ nên làm cùng một công việc là không đúng. Hãy tưởng tượng tập dữ liệu thử nghiệm này:

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;

Kết quả

ID
---
1
2
3

ID
---
1
1
1
2
2
3

Kết quả của bạn chỉ giống nhau nếu cột bạn đang tìm kiếm là duy nhất.

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;

Mặc dù kết quả là như nhau, nhưng kế hoạch thực hiện thì không. Truy vấn đầu tiên sử dụng IN có thể sử dụng kết hợp chống bán, có nghĩa là nó biết rằng dữ liệu trong t2 là không cần thiết, vì vậy ngay khi tìm thấy một kết hợp duy nhất, nó có thể ngừng quét để tìm các kết hợp tiếp theo.

Nếu bạn giới hạn bảng thứ hai của mình chỉ có các giá trị duy nhất, thì bạn sẽ thấy cùng một kế hoạch:

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;

Tóm lại, hai truy vấn không phải lúc nào cũng mang lại kết quả giống nhau và không phải lúc nào chúng cũng có cùng một kế hoạch. Nó thực sự phụ thuộc vào Chỉ mục của bạn và độ rộng của dữ liệu / truy vấn của bạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tạo RAND () Xác định trong SQL Server

  2. Cách tốt nhất để triển khai Hiệp hội đa hình trong SQL Server là gì?

  3. Sự khác biệt giữa việc thêm các tham số vào thủ tục được lưu trữ trong SQL Server?

  4. Sử dụng DateTime trong SqlParameter cho thủ tục được lưu trữ, lỗi định dạng

  5. Cách cập nhật khóa chính