Tôi có một truy vấn tham gia một vài bảng và thực hiện khá tệ - ước tính hàng bị tắt (1000 lần) và tham gia Vòng lặp lồng nhau được chọn, dẫn đến quét nhiều bảng. Hình dạng của truy vấn khá đơn giản, trông giống như thế này:
SELECT t1.id
FROM t1
INNER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id
LEFT OUTER JOIN t4 ON t3.t4_id = t4.id
WHERE t4.id = some_GUID
Chơi xung quanh với truy vấn, tôi nhận thấy rằng khi tôi gợi ý nó sử dụng phép nối Hợp nhất cho một trong các phép nối, nó chạy nhanh hơn nhiều lần. Điều này tôi có thể hiểu - Hợp nhất tham gia là một tùy chọn tốt hơn cho dữ liệu được tham gia, nhưng SQL Server chỉ không ước tính đúng khi chọn Vòng lặp lồng nhau.
Điều tôi không hiểu đầy đủ là tại sao gợi ý tham gia này thay đổi tất cả các ước tính cho tất cả các nhà khai thác kế hoạch? Từ việc đọc các bài báo và sách khác nhau, tôi giả định rằng các ước tính cardinality được thực hiện trước khi kế hoạch được xây dựng, do đó, việc sử dụng một gợi ý sẽ không thay đổi các ước tính, nhưng nói rõ ràng với SQL Server để sử dụng triển khai tham gia vật lý cụ thể.
Tuy nhiên, những gì tôi thấy là gợi ý Hợp nhất làm cho tất cả các ước tính trở nên khá hoàn hảo. Tại sao điều này xảy ra và có bất kỳ kỹ thuật phổ biến nào để tối ưu hóa truy vấn đưa ra ước tính tốt hơn mà không có gợi ý - xem xét rằng thống kê rõ ràng cho phép điều này?
CẬP NHẬT: các kế hoạch thực hiện ẩn danh có thể được tìm thấy ở đây: https://www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan?dl=0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hints_join.s = 0
Tôi đã kiểm tra các số liệu thống kê được sử dụng bởi cả hai truy vấn bằng TF 3604, 9292 và 9204 và các truy vấn này giống hệt nhau. Tuy nhiên, các chỉ mục được quét / tìm kiếm khác nhau giữa các truy vấn.
Ngoài ra, tôi đã thử chạy truy vấn với OPTION (FORCE ORDER)
- nó chạy nhanh hơn cả sử dụng phép nối, chọn HASH MATCH cho mỗi lần nối.