Tại sao đặt Thống kê cập nhật tự động thành Sai?


10

Tôi vừa mới thừa hưởng khoảng 20 phiên bản SQL Server, như một phần của dự án mua lại rộng hơn. Tôi đang trong quá trình đánh giá hiệu suất và tôi không thích cách các kế hoạch bảo trì đã được thực hiện.

Tôi đang thấy việc xây dựng lại chỉ số chăn hàng ngày (tôi có thể giải quyết vấn đề này) và cập nhật thống kê thủ công hàng ngày.

Khoảng một nửa cơ sở dữ liệu đã được đặt thành Tự động cập nhật thống kê = Sai, vì những lý do không rõ ràng ngoài tôi được bảo là giảm "Vấn đề về hiệu suất" ...

Tôi luôn nghĩ và làm việc để thực hành tốt nhất việc đặt cài đặt này thành True và cảm thấy Cập nhật thủ công là không cần thiết nếu cài đặt này là True. Liệu tôi có sai?

Bất cứ ai cũng có thể giải thích những lợi ích sẽ có khi đặt bộ này là Sai, nhưng thay vào đó thực hiện cập nhật thủ công hàng ngày?

Tôi nên đề cập rằng một số cơ sở dữ liệu có tính giao dịch cao (hàng triệu Chèn, Xóa, Cập nhật mỗi ngày) Các cơ sở dữ liệu khác có tỷ lệ giao dịch thấp và một số chỉ ở chế độ chỉ đọc. Không có vần điệu hoặc lý do nào có cài đặt Cập nhật tự động được đặt thành Sai. Nó dường như là một xổ số.

Câu trả lời:


6

Bạn đã đúng, tôi cũng tin rằng trong hầu hết các trường hợp, Auto Update statisticsnên đặt thành đúng, chúng ta nên cho phép SQL Server quyết định khi nào cập nhật số liệu thống kê và tin tôi rằng nó hoạt động tốt. Khi điều này được đặt thành đúng, đảm bảo các số liệu thống kê được cập nhật về phân phối dữ liệu trong trường, điều này cuối cùng sẽ giúp tối ưu hóa để chuẩn bị kế hoạch tốt hơn. Điều quan trọng cần lưu ý ở đây là Tự động cập nhật số liệu thống kê khi 20% dữ liệu thay đổi trong bảng. Vì vậy, bạn không nên cảm thấy rằng trên một bảng có 100K hàng nếu 10 hàng được cập nhật thì cập nhật trạng thái sẽ kích hoạt.

Một phân tích sâu hơn được thực hiện bởi Paul Randal trong blog Hiểu khi thống kê sẽ tự động cập nhật . Tôi chưa thấy bất kỳ nhược điểm nào nếu tùy chọn này được đặt thành đúng. Có, bạn có thể thấy một số hoạt động I / O khi tùy chọn này được đặt thành đúng.

Kết luận quan trọng mà người ta có thể rút ra từ blog là

Ngay cả khi một thống kê trở nên lỗi thời do kết quả của sửa đổi, nó sẽ không tự động cập nhật sau khi sửa đổi hoàn tất. Thống kê sẽ tự động cập nhật vào lần tiếp theo kế hoạch truy vấn sử dụng nó.

Đối với các trường hợp bạn chỉ đọc cơ sở dữ liệu hoặc cơ sở dữ liệu nơi bạn chỉ thực hiện thao tác chọn và không có hoạt động DML, trong trường hợp đó bạn có thể giữ tùy chọn thành sai nhưng một lần nữa sẽ không có hại nếu bạn giữ đúng. Chúng tôi chủ yếu nhìn thấy cơ sở dữ liệu với số lượng hoạt động nhất định.


10

Điều này quá dài cho một nhận xét vì vậy tôi sẽ đồng ý với một trường hợp khác mà người ta có thể muốn tắt thống kê cập nhật tự động. Tôi đã làm việc với các cơ sở dữ liệu hỗ trợ khối lượng công việc OLTP khối lượng lớn và SLA hiệu suất truy vấn nghiêm ngặt tính bằng mili giây. Gần như tất cả các truy vấn đều tầm thường với rất nhiều sự chú ý đến chi tiết điều chỉnh truy vấn và chỉ mục và một số bảng khá lớn. Không có nhiều giá trị trong việc cập nhật số liệu thống kê trong giai đoạn cao điểm trong tình huống này và số liệu thống kê tự động cập nhật sẽ vi phạm SLA. Do đó, bảo trì đã được thực hiện trong thời gian không cao điểm thông qua một công việc theo lịch trình.

Một tùy chọn khác là bật cả hai AUTO_UPDATE_STATISTICSAUTO_UPDATE_STATISTICS_ASYNCtùy chọn cơ sở dữ liệu. Điều này sẽ cho phép các truy vấn tiến hành các kế hoạch thực hiện dựa trên số liệu thống kê cũ thay vì phải chịu chi phí cập nhật đồng bộ. Điều này đặc biệt thích hợp cho một khối lượng công việc OLTP miễn là máy chủ có kích thước phù hợp với khối lượng công việc truy vấn cộng với cập nhật thống kê nền.


Tôi đã cố gắng nghĩ về một ví dụ trong đó auto_update_stats thực sự sẽ gây ra sự cố và đây là một ví dụ tuyệt vời - tôi cũng sẽ nâng cấp nó hai lần (nếu tôi có thể) để giải quyết công việc tuyệt vời, tránh sự chậm trễ chỉ số thông thường đi kèm với truy vấn
SqlRyan

1
Tôi đã gặp tình huống với cơ sở dữ liệu lớn hơn (VLDB), rằng tùy chọn thống kê auto_update là ON và SQL sẽ khởi động trong thời gian không phù hợp của ngày làm việc. Tôi đã tắt nó và phải có chiến lược hơn về cập nhật thủ công cho các bảng và số liệu thống kê cụ thể, thay vì để máy chủ xác định các bảng và khi nào. Điều này làm cho hệ thống của tôi dễ dự đoán hơn, nhưng với chi phí quản lý cao hơn (không nghi ngờ gì), nhưng cần phải xảy ra để tránh xâm nhập vào các nhiệm vụ cập nhật. Nếu "xóa" hệ thống với quản lý chỉ số / thống kê điển hình là việc của bạn, hãy tiếp tục. Nếu không, một số tình huống có thể yêu cầu chiến lược chi tiết.
SnapJag

6

Nói chung tôi sẽ nói rằng có số liệu thống kê cập nhật tự động trên là có lợi. Nhưng giống như bất kỳ cài đặt nào, có những lý do bạn có thể bật hoặc tắt.

Một là một số bảng có nhiều khúc mắc và có lẽ các truy vấn không nhạy cảm lắm với các thống kê chính xác. Hãy suy nghĩ về ETL hoặc các tình huống hàng loạt khác khi bạn thay đổi nhiều dữ liệu, nhưng không đọc nó từ đó hoặc không đọc nhiều. Không có nhiều điểm để cập nhật số liệu thống kê tự động và khiến một loạt I / O cung cấp số liệu thống kê chính xác hơn chưa từng được sử dụng.

Bạn cũng có thể có các tình huống trong đó bạn cập nhật dữ liệu nhiều lần trong ngày, nhưng không nhất thiết muốn cập nhật số liệu thống kê sau mỗi lần cập nhật. (Giả sử dữ liệu chỉ được truy vấn trong một số giờ nhất định trong ngày - không cần cập nhật số liệu thống kê nhiều lần khi dữ liệu sẽ không được truy vấn trong lúc này.)

Hoặc có thể bạn chỉ có một khối lượng công việc nặng. Hoặc các bài đọc nói chung là quét toàn bộ, trong đó số liệu thống kê không phải là cực kỳ quan trọng.

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.