2016-03-17 21 views
5

Tôi có 2 bảng (table1 table2), table2 lớn hơn table1.Thứ tự "Tham gia" sẽ dẫn đến hiệu suất truy vấn khác nhau

Script 1:

SELECT t1.A, t2.B 
FROM table1 AS t1 
JOIN table2 AS t2 ON t1.PK = t2.FK 

Script 2:

SELECT t1.A, t2.B 
FROM table2 AS t2 
JOIN table1 AS t1 ON t1.PK = t2.FK 

Liệu hiệu suất kịch bản # 1 sẽ là tốt hơn so với kịch bản # 2?

+3

'SQL Server' tạo kế hoạch thực hiện dựa trên chi phí ... Vì vậy, trả lời - không. – Devart

+1

Tham gia bên trong hoàn toàn giao hoán và trình tối ưu hóa sắp xếp lại chúng khi nó thấy vừa vặn với điều kiện bạn không có gợi ý buộc phải tham gia. –

+4

Tôi không hiểu những câu trả lời về câu hỏi này. Đó là một thử nghiệm rất dễ dàng để làm cho mình - dễ dàng như vậy tôi thậm chí được coi là một downvote. –

Trả lời

2

Bạn đang sử dụng INNER JOIN để câu trả lời là NO.

Điều này sẽ tạo ra chính xác cùng một lượng dữ liệu do loại kết nối và bạn đang tham gia bởi cùng một mối quan hệ trong cả hai truy vấn, do đó về cơ bản chúng giống hệt nhau. Nó có thể khác nếu bạn đã sử dụng LEFT JOIN, bởi vì trong một phép nối trái, tất cả dữ liệu từ bảng chính (trái) được giữ và tất cả dữ liệu khớp từ bảng chi tiết (bên phải) . Vì vậy, nếu bạn đã sử dụng trái tham gia, và đặt bảng lớn hơn ở phía bên trái, sau đó truy vấn sẽ tạo ra nhiều dữ liệu hơn và có lẽ sẽ chậm hơn sau đó đặt bảng lớn hơn ở phía bên phải.

2

nên tạo cùng một gói. Nhưng nếu bạn có nhiều sự tham gia xáo trộn thứ tự tham gia có thể thay đổi kế hoạch do số lượng lớn các cách có thể để xử lý các kết nối đó.

Xem Optimizing Join Orders

Tất nhiên điều này chỉ dành cho Nội tham gia, Outer tham gia có thể đưa ra kết quả khác nhau. Btw, trình tối ưu hóa nên yêu các kết nối bên ngoài, nó giảm đáng kể số lượng các lệnh tham gia có thể :-)

2

Nối bên trong là giao hoán, điều đó có nghĩa là tham gia b = b tham gia.Làm phép nối có thể là tham gia bên trong, nhưng kế hoạch thực hiện sql có thể cố gắng xem xét các vòng lặp lồng nhau, băm hoặc hợp nhất dựa trên một số tham số..Không có sự tham gia vật lý nào là xấu, mỗi cái có lợi thế riêng của nó.

Một điều mà bạn có thể quan tâm từ phía bạn (ở mức tối thiểu,) là cố gắng xem liệu cả hai cột tham gia có được lập chỉ mục, sargabilty, không chuyển đổi tiềm ẩn hay không.

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