2011-06-30 29 views
7

Tôi có một truy vấn sql thực hiện rất kém. Tôi đã theo dõi nó xuống INNER JOIN được thực hiện trên bàn. Thay đổi này sang trái tham gia tăng đáng kể hiệu suất (từ 6 phút 20 giây) - bây giờ tôi biết 2 không equiv, nhưng ... đây là những gì tôi đang hỏiCâu hỏi SQL bên trong vs bên trái

SELECT * 
    FROM SomeTable ST 
    JOIN BigTable BT ON BT.SomeID = ST.SomeID 
        AND BT.Something = ST.Something 
        AND BT.AnotherValue = '123' 

Kể từ khi tham gia có tiêu chí bổ sung (và cái gì đó = cái gì đó) - đang thay đổi điều này thành một phép nối trái tạo ra cùng một kết quả - nhưng MUCH nhanh hơn?

Các kết quả trả về đều giống nhau sử dụng LEFT/INNER với trái là nhanh hơn đáng kể ...

+0

Điều này thật kì lạ, vì trong hầu hết các trường hợp, 'INNER JOIN' hoạt động tốt hơn. 'OUTER JOIN' phải trả về các hàng ngay cả khi không có kết quả khớp. Bạn có chắc chắn không có nhiều điều này hơn loại tham gia không? – Yuck

+0

YUP, im lẫn hơn bao giờ hết - số lần đọc logic giảm xuống hàng triệu (nhiều triệu) – user822150

+0

bạn có thể đăng kế hoạch thực hiện cho cả hai? – Thilo

Trả lời

2

Dường như làm liên kết nội cách khác xung quanh sẽ cung cấp một hiệu suất tốt hơn ...

SELECT 
    * 
FROM 
    BigTable AS BT 
INNER JOIN 
    SomeTable AS ST 
ON 
    BT.AnotherValue = '123' 
AND 
    BT.SomeID = ST.SomeID 
AND 
    BT.Something = ST.Something 

hoặc với subquery

SELECT 
    * 
FROM 
    (SELECT * FROM BigTable WHERE AnotherValue = '123') AS BT 
INNER JOIN 
    SomeTable AS ST 
AND 
    BT.SomeID = ST.SomeID 
AND 
    BT.Something = ST.Something 

Ngoài ra, hãy chắc chắn rằng BigTable.AnotherValue được lập chỉ mục đúng cách.

0

Trong khi bạn nhận được kết quả tương tự từ cả hai tham gia quan trọng của nó để hiểu rằng một tham gia trái là khác nhau từ một tham gia bên trong.

Kết nối bên trái sẽ lấy tất cả các hàng từ bảng bên trái ngay cả khi không có khớp trong bảng bên phải.

SQL LEFT JOIN vs SQL INNER JOIN

Vì vậy, dữ liệu của bạn chỉ xảy ra được sản xuất một cách đó là giống hệt nhau được tham gia hai khác nhau.

SELECT * 
    FROM SomeTable ST 
    JOIN BigTable BT ON BT.SomeID = ST.SomeID 
        AND BT.Something = ST.Something 
        AND BT.AnotherValue = '123' 

Làm thế nào về điều này:

SELECT 
    * 
FROM 
    SomeTable 
     INNER JOIN 
    BigTable 
     ON SomeTable.PreferedPrimaryKey = BigTable.PreferAForeignKey 
     AND SomeTable.SomethingThatIsIndexedAndPreferableNumeric = BigTable.SomethingThatIsIndexedAndPreferableNumeric 
WHERE 
    BigTable.AnotherValue = '123' 

Kiểm tra chỉ số của bạn và chắc chắn rằng tiêu chí của bạn cho phần thứ hai của kết nối không phải là một chuỗi ký tự không lập chỉ mục.

+1

Bạn không sử dụng w3schools làm nguồn đáng tin cậy. Không bao giờ. Đó là những gì họ nói với tôi. – user194076

+0

Tôi không biết bạn đã nghe về trường học này ở đâu, nhưng việc tham gia sql đã tồn tại trong nhiều thập kỷ và được thực hiện trong một số cơ sở dữ liệu. Họ có thể có quyền này. – JeffO

+0

Đúng vậy. Điều đó thực sự quan trọng. –

Các vấn đề liên quan