LỰA CHỌN FORCE FORCE cải thiện hiệu suất cho đến khi các hàng bị xóa


9

Tôi có một truy vấn SQL Server 2008 hơi phức tạp (khoảng 200 dòng SQL khá dày đặc) không hoạt động khi tôi cần. Theo thời gian, hiệu suất giảm từ khoảng 0,5 giây xuống còn khoảng 2 giây.

Nhìn vào kế hoạch thực hiện, có một điều khá rõ ràng là bằng cách sắp xếp lại các phép nối, hiệu suất có thể được cải thiện. Tôi đã làm, và nó đã ... xuống còn khoảng 3 giây. Bây giờ truy vấn có gợi ý "LỰA CHỌN LỰA CHỌN LỰA CHỌN" và cuộc sống rất tốt.

Hôm nay tôi đến, dọn dẹp cơ sở dữ liệu. Tôi lưu trữ khoảng 20% ​​các hàng, không thực hiện hành động nào trong cơ sở dữ liệu có liên quan ngoại trừ xóa các hàng ... kế hoạch thực hiện được HOÀN TOÀN hos . Nó hoàn toàn đánh giá sai có bao nhiêu hàng cây con nhất định sẽ trả về và (ví dụ) thay thế một:

<Hash>

với

<NestedLoops Optimized='false' WithUnorderedPrefetch='true'>

Bây giờ thời gian truy vấn tăng đột biến từ khoảng .3 giây đến khoảng 18 giây. (!) Chỉ vì tôi đã xóa hàng. Nếu tôi xóa gợi ý truy vấn, tôi sẽ quay lại khoảng 2 giây thời gian truy vấn. Tốt hơn, nhưng tồi tệ hơn.

Tôi đã tái tạo vấn đề sau khi khôi phục cơ sở dữ liệu tới nhiều vị trí và máy chủ. Chỉ cần xóa khoảng 20% ​​số hàng từ mỗi bảng luôn gây ra sự cố này.

  1. Đây có phải là bình thường đối với một lệnh tham gia bắt buộc để làm cho các ước tính truy vấn hoàn toàn không chính xác (và do đó thời gian truy vấn không thể đoán trước)?
  2. Tôi có nên hy vọng rằng tôi sẽ phải chấp nhận hiệu suất truy vấn tối ưu phụ hay xem nó như một con chim ưng và thường xuyên chỉnh sửa gợi ý truy vấn không? Hoặc có thể gợi ý mỗi tham gia là tốt? .3s đến 2s là một thành công lớn.
  3. Rõ ràng là tại sao trình tối ưu hóa lại nổ tung sau khi xóa các hàng? Ví dụ: "có, nó đã quét mẫu và vì tôi đã lưu trữ hầu hết các hàng trước đó trong lịch sử dữ liệu, mẫu mang lại kết quả thưa thớt, vì vậy nó đánh giá thấp sự cần thiết của thao tác băm được sắp xếp"?

Nếu bạn muốn xem kế hoạch thực hiện, vui lòng đề xuất một vị trí tôi có thể đăng chúng. Mặt khác, tôi đã lấy mẫu bit tuyệt vời nhất. Đây là ước tính sai cơ bản, các số trong parens là các hàng (ước tính: thực tế).

                             /  Clustered Index Scan (908:7229)
Nested Loops (Inner Join) --<
                             \  NonClustered Index Seek (1:7229)

Lưu ý vòng lặp bên trong dự kiến ​​sẽ quét 908 hàng, nhưng thay vào đó quét 52.258.441. Nếu nó là chính xác, chi nhánh này sẽ chạy khoảng 2ms, thay vì 12 giây. Trước khi xóa các hàng, ước tính tham gia bên trong này chỉ bị tắt bởi tổng hệ số là 2 và được thực hiện dưới dạng khớp băm trên hai chỉ mục được nhóm.

Câu trả lời:


6

Đây có phải là bình thường đối với một lệnh tham gia bắt buộc để làm cho các ước tính truy vấn hoàn toàn không chính xác (và do đó thời gian truy vấn không thể đoán trước)?

Việc sử dụng FORCE ORDER không làm cho các ước tính không chính xác, việc xóa các hàng đã làm. Buộc cập nhật số liệu thống kê trên bảng có thể cải thiện độ chính xác của ước tính.

Tôi có nên hy vọng rằng tôi sẽ phải chấp nhận hiệu suất truy vấn tối ưu phụ hay xem nó như một con chim ưng và thường xuyên chỉnh sửa gợi ý truy vấn không? Hoặc có thể gợi ý mỗi tham gia là tốt? .3s đến 2s là một thành công lớn.

Tốt hơn là sẽ đảm bảo trình tối ưu hóa được cung cấp thông tin cần thiết để tạo kế hoạch tốt nhất, mà không cần sử dụng gợi ý FORCE ORDER. Bằng cách đó, nó sẽ đối phó tốt hơn với các thay đổi đối với phân phối dữ liệu cơ bản mà không cần can thiệp thủ công. Điều đó nói rằng, nếu bản chất của dữ liệu là mức độ chính xác có thể thay đổi đáng kể theo từng giờ hoặc từng giờ, hãy xem xét sử dụng một hướng dẫn kế hoạch để đảm bảo kế hoạch được cố định.

Rõ ràng là tại sao trình tối ưu hóa lại nổ tung sau khi xóa các hàng? Ví dụ: "có, nó đã quét mẫu và vì tôi đã lưu trữ hầu hết các hàng trước đó trong lịch sử dữ liệu, mẫu mang lại kết quả thưa thớt, vì vậy nó đánh giá thấp sự cần thiết của thao tác băm được sắp xếp"?

Bạn đã không đề cập đến số lượng hàng trong các bảng vấn đề nhưng có khả năng là xóa.

  • không xóa đủ hàng để kích hoạt cập nhật thống kê. Điều này sẽ xảy ra khi 20% hàng đã được sửa đổi nhưng có tùy chọn sử dụng cờ theo dõi 2371 để bật ngưỡng động.
  • đã kích hoạt một bản cập nhật thống kê nhưng mẫu thu thập không phải là đại diện. Sửa lỗi này bằng cách chạy cập nhật thủ công VỚI FULLSCAN .

Bạn cũng có thể gặp phải các vấn đề đánh hơi thông số lỗi thời , trong đó có vô số lựa chọn để giải quyết. VỚI RECOMPILE có thể là một tùy chọn đắt tiền để chỉ định với một truy vấn lớn như vậy nhưng nó đáng để nghiên cứu ở cả cấp độ thủ tục và câu lệnh.


Chỉ cần làm rõ, đó có thể là ngữ nghĩa: "Việc sử dụng FORCE ORDER không làm cho các ước tính không chính xác, việc xóa các hàng đã làm." Vì vậy, bạn nghĩ rằng đó chỉ là cơ hội ngẫu nhiên mà việc loại bỏ "LỆNH FORCE" đã cải thiện truy vấn rất nhiều? Gợi ý không đưa ra trình tối ưu hóa dựa vào số liệu thống kê, nó sẽ ít chú trọng hơn hoặc không được phát hiện trong thử nghiệm ứng dụng vì thống kê kém tin cậy này hiếm khi là mấu chốt?
shannon

Tôi nghĩ là có, trong đó những người tối ưu lựa chọn kế hoạch xảy ra để đối phó với số liệu thống kê không chính xác nhưng kế hoạch dẫn đến lệnh tham gia bị ép buộc thì không. Tôi không biết về LỆNH FORCE gây ra bất kỳ thay đổi nào đối với việc đánh giá thống kê, người khác sẽ kêu gọi nếu họ biết bất cứ điều gì ngược lại. Cũng cần xem xét liệu giá trị bạn đã chọn để TỐI ƯU HÓA có phù hợp hay không. Có thể số liệu thống kê đó hoàn toàn tốt nhưng bạn đang buộc một kế hoạch dựa trên giá trị không mang tính đại diện.
Mark Storey-Smith

Đúng. Tôi có cùng một vấn đề hiệu suất vượt qua các tham số chính xác như tôi đã tối ưu hóa chúng. Cảm ơn một lần nữa.
shannon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.