Tôi có một bảng và đối với một tập hợp các trường a, b và c đã cho, tôi cần lấy các hàng đầu tiên và cuối cùng được sắp xếp theo d và e, và đang sử dụng ROW_NUMBER để có được các hàng này. Phần có liên quan của tuyên bố là ...
ROW_NUMBER() OVER (PARTITION BY a,b,c ORDER BY d ASC, e ASC) AS row_number_start,
ROW_NUMBER() OVER (PARTITION BY a,b,c ORDER BY d DESC, e DESC) AS row_number_end
Kế hoạch thực hiện cho thấy hai hoạt động sắp xếp, một cho mỗi hoạt động. Các hoạt động sắp xếp này chiếm hơn 60% tổng chi phí của câu lệnh (chúng tôi đang nói về hàng chục triệu hàng ở đây, các phân vùng thường sẽ có 1-100 bản ghi trên mỗi phân vùng, chủ yếu dưới 10)
vì vậy sẽ tốt nếu tôi có thể thoát khỏi một trong số họ. Tôi đã cố gắng tạo một chỉ mục để sao chép sắp xếp; điều này đã loại bỏ một trong các hoạt động sắp xếp nhưng không phải là hoạt động sau. (Lưu ý rằng mọi chỉ mục được tạo sẽ chỉ được sử dụng cho quy trình này và sẽ được tạo lại hàng ngày như một phần của quy trình ETL.)
Từ việc kiểm tra kế hoạch thực hiện, tôi tin rằng vấn đề là khi thực hiện phân vùng bằng câu lệnh, SQL Server khăng khăng yêu cầu sắp xếp theo các cột phân vùng trên cơ sở tăng dần. Về mặt logic, không có vấn đề gì nếu bạn đặt hàng tăng dần hoặc giảm dần, và nếu trình tối ưu hóa hiểu điều này thì nó chỉ có thể đọc cùng một chỉ mục ngược để xử lý row_number_end.
Có cách nào tôi có thể làm cho trình tối ưu hóa có ý nghĩa ở đây không, hoặc ai đó có thể đề xuất một phương pháp thay thế để đạt được mục tiêu cuối cùng không?