Tôi có một bảng (MainTable
) với hơn 600.000 bản ghi. Nó tham gia vào chính nó thông qua một bảng thứ 2 (JoinTable
) trong một mối quan hệ kiểu phụ huynh/trẻ em:LEFT JOIN Đáng kể nhanh hơn INNER JOIN
SELECT Child.ID, Parent.ID
FROM MainTable
AS Child
JOIN JoinTable
ON Child.ID = JoinTable.ID
JOIN MainTable
AS Parent
ON Parent.ID = JoinTable.ParentID
AND Parent.SomeOtherData = Child.SomeOtherData
Tôi biết rằng mọi kỷ lục con có một hồ sơ phụ huynh và các dữ liệu trong JoinTable được acurate.
Khi tôi chạy truy vấn này, phải mất vài phút để chạy. Tuy nhiên nếu tôi tham gia vào chuyên sử dụng một Left Join sau đó phải mất < 1 giây để chạy:
SELECT Child.ID, Parent.ID
FROM MainTable
AS Child
JOIN JoinTable
ON Child.ID = JoinTable.ID
LEFT JOIN MainTable
AS Parent
ON Parent.ID = JoinTable.ParentID
AND Parent.SomeOtherData = Child.SomeOtherData
WHERE ...[some info to make sure we don't select parent records in the child dataset]...
Tôi hiểu sự khác biệt trong kết quả giữa một INNER JOIN
và LEFT JOIN
. Trong trường hợp này, nó sẽ trả về chính xác kết quả giống như mọi đứa trẻ có cha/mẹ. Nếu tôi cho phép cả hai truy vấn chạy, tôi có thể so sánh các tập dữ liệu và chúng giống hệt nhau.
Tại sao số LEFT JOIN
chạy nhanh hơn rất nhiều so với INNER JOIN
?
CẬP NHẬT Kiểm tra gói truy vấn và khi sử dụng tham gia bên trong, bắt đầu với tập dữ liệu Gốc. Khi thực hiện một phép nối trái, nó bắt đầu với tập dữ liệu con.
Các chỉ mục mà nó sử dụng đều giống nhau.
Tôi có thể buộc nó luôn bắt đầu với đứa trẻ không? Sử dụng một công việc tham gia trái, nó chỉ cảm thấy sai.
Câu hỏi tương tự đã được hỏi ở đây trước đây, nhưng dường như không có câu trả lời nào cho câu hỏi của tôi.
ví dụ: câu trả lời được chọn trong INNER JOIN vs LEFT JOIN performance in SQL Server cho biết rằng Gia nhập trái luôn luôn chậm hơn so với Gia nhập bên trong. Lập luận có ý nghĩa, nhưng nó không phải là những gì tôi nhìn thấy.
Kiểm tra gói. – Blorgbeard
@Blogbeard - xem cập nhật – Greg