Câu đố tối ưu hóa truy vấn SQL server 2008 R2
Chúng tôi có hai bảng, cả hai đều chứa 9 triệu hàng. 70.000 hàng là khác nhau, những hàng khác là như nhau.
Tốc độ này nhanh, 13 giây,
select * from bigtable1
except select * from similar_bigtable2
Điều này sắp xếp đầu ra và cũng nhanh, 13 giây là tốt,
select * into #q from bigtable1
except select * from similar_bigtable2
select * from #q order by sort_column
Trong khi điều này là rất chậm:
;with q as (
select * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
Và thậm chí một "mẹo" mà đôi khi tôi sử dụng để gợi ý SQL Server rằng nó cần phải tính toán trước một phần nhất định của truy vấn trước khi tiếp tục, không hoạt động và cũng dẫn đến truy vấn chậm:
;with q as (
select top 100 percent * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
Nhìn vào các kế hoạch truy vấn, lý do không khó để tìm thấy:
SQL Server đặt hai loại 9 triệu hàng trước hashmatch, trong khi tôi muốn nó chỉ thêm một loại 70.000 hàng sau hashmatch.
Vì vậy, câu hỏi: làm thế nào tôi có thể hướng dẫn trình tối ưu hóa truy vấn để làm điều đó?
EXCEPT
(ví dụ OUTER JOIN
)? Tôi nhận ra cú pháp ít thuận tiện hơn nhưng bạn có thể chơi với gợi ý chỉ mục / tham gia tốt hơn ở đó (hoặc bạn có thể không cần). Cách thay thế bạn đang sử dụng bây giờ (đưa vào bảng #temp trước) là cách giải quyết cuối cùng nhưng trong một số trường hợp là cách duy nhất để buộc trình tối ưu hóa tách biệt hoàn toàn hai phần của truy vấn theo cách bạn muốn.