Dựa trên câu hỏi của bạn, tôi có thể nghĩ ra bốn vấn đề có thể xảy ra với số liệu thống kê có thể gây ra sự cố mà bạn đang gặp phải.
1. Thống kê không được tự động cập nhật thường xuyên đủ.
Trong SQL Server 2012, số liệu thống kê chỉ được cập nhật sau khi 20% hoặc nhiều hơn các hàng trong bảng đã thay đổi. Điều đó có nghĩa là đối với một bảng hàng tỷ, bạn sẽ cần sửa đổi 200 M hàng trước khi cập nhật thống kê xảy ra. Khi bảng phát triển lớn hơn, các cập nhật thống kê của bạn sẽ trở nên không thường xuyên hơn, do đó, SQL Server có thể mất nhiều năm mà không cập nhật thống kê trên các bảng lớn.
TF 2371 thay đổi ngưỡng để cập nhật thống kê xảy ra thường xuyên hơn. Trong SQL Server 2016, sự thay đổi này đã được thực hiện theo mặc định của tôi.
2. Truy vấn trong khối lượng công việc của bạn dễ bị ảnh hưởng bởi vấn đề chính tăng dần .
Xem xét một bảng có dữ liệu mới được tải hàng ngày và các truy vấn lọc vào ngày dữ liệu mới nhất. Trừ khi cập nhật thống kê được cập nhật ngay lập tức sau khi tải dữ liệu, dữ liệu mới sẽ không xuất hiện trong bất kỳ biểu đồ thống kê nào. Điều đó có thể dẫn đến hiệu suất truy vấn rất kém do ước tính cardinality thấp.
CE mới trong SQL Server 2014 giúp cải thiện lĩnh vực này. Nếu bạn yêu cầu dữ liệu ngoài phạm vi biểu đồ, nó có thể đưa ra dự đoán lạc quan hơn và cho rằng có dữ liệu trong bảng nhưng không có trong biểu đồ. Trong SQL Server 2012, bạn có thể giải quyết vấn đề này, nếu bạn có nó, bằng cách cập nhật số liệu thống kê thường xuyên hơn hoặc bằng cách bật TF 4139 . TF 4139 chỉ hoạt động đối với các cột có chỉ mục trên chúng. SQL Server có thể chạy một truy vấn rất nhanh đối với chỉ mục để có giá trị cao nhất hoặc thấp nhất và sẽ tạm thời sửa đổi biểu đồ của đối tượng thống kê có liên quan. Điều này có thể dẫn đến kế hoạch tốt hơn nhiều cho một số truy vấn.
3. Truy vấn của bạn chờ cập nhật thống kê.
Theo mặc định, nếu một truy vấn tải một bản cập nhật thống kê cũ, nó sẽ cập nhật đối tượng thống kê đó trước khi tạo một kế hoạch truy vấn. Trên SQL Server 2012, cập nhật thống kê được lấy mẫu sẽ chạy với MAXDOP 1
. Nếu bắt đầu với một bảng lớn, quá trình có thể hết thời gian chờ trong khi chờ cập nhật thống kê hoàn tất. Sau khi bạn cập nhật số liệu thống kê theo bảng, truy vấn sẽ hoạt động tốt hơn vì không còn phải chờ cập nhật thống kê.
Nếu bạn gặp phải vấn đề này, điều này có thể được giải quyết bằng cách bảo trì thống kê chủ động hơn với NORECOMPUTE
tùy chọn. Ngoài ra, bạn có thể thử làm cho cập nhật thống kê nhanh hơn bằng cách Nâng cấp lên SQL Server 2016. Trên SQL Server 2016, các cập nhật thống kê được lấy mẫu có thể chạy song song.
Một tùy chọn khác là bật AUTO_UPDATE_STATISTICS_ASYNC
tùy chọn. Nếu một kế hoạch truy vấn gặp một đối tượng thống kê cũ, nó sẽ xếp hàng đối tượng thống kê đó sẽ được cập nhật bởi một công việc nền. Điều này có vẻ xấu và nó là. Các truy vấn có thể thực hiện với số liệu thống kê cũ. Đây là loại tính năng mà bạn muốn bật khi bạn không có lựa chọn nào tốt hơn, chẳng hạn như khi làm việc với các hệ thống lớn, nơi cập nhật thống kê tự động quá đắt hoặc chỉ không giúp đủ hình dạng kế hoạch. Jack Li viết blog về một khách hàng đã được giúp đỡ với tùy chọn này ở đây .
4. Khối lượng công việc của bạn sẽ được hưởng lợi từ các cập nhật thống kê thủ công với tỷ lệ mẫu cao hơn tỷ lệ mẫu tự động.
Một số truy vấn và khối lượng công việc cần nhiều hơn tỷ lệ thống kê được lấy mẫu mặc định để đạt được hiệu suất chấp nhận được. Điều này có thể khó thực hiện trên một cơ sở dữ liệu lớn nhưng có một vài thủ thuật và một vài cải tiến trong các phiên bản SQL Server sau này sẽ giúp ích.
Nếu bạn biết rất rõ dữ liệu và khối lượng công việc của mình, bạn có thể tắt cập nhật thống kê tự động. Bạn có thể thu thập số liệu thống kê mà bạn cần FULLSCAN
và cập nhật chúng khi thích hợp. Cách tiếp cận này sẽ đòi hỏi rất nhiều công việc và rất nhiều sự chú ý đến máy chủ.
Nếu bạn có một quy trình bảo trì hiện có để xây dựng lại các chỉ mục (sự khôn ngoan trong đó đang tranh luận ) thì lưu ý rằng việc xây dựng lại các chỉ mục sẽ tự động cập nhật các số liệu thống kê FULLSCAN
, vì vậy có lẽ bạn có thể tận dụng điều đó nếu bạn xây dựng giải pháp bảo trì để cập nhật số liệu thống kê.
Lưu ý rằng việc thu thập số liệu thống kê được lấy mẫu có thể không nhanh hơn thống kê toàn màn hình, đặc biệt nếu cột biểu đồ được lập chỉ mục. SQL Server có thể thực hiện cập nhật thống kê fullscan song song. Nó cũng có thể tránh sắp xếp khi thực hiện toàn màn hình của một cột được lập chỉ mục nhưng sẽ không tránh được sắp xếp khi lấy mẫu cột. Trong thực tế, đối với các bảng đủ lớn, các cập nhật thống kê đối với các cột không được lập chỉ mục có thể thất bại nếu chúng lấp đầy tempdb.
SQL Server 2014 đã giới thiệu số liệu thống kê gia tăng . Giả sử rằng bạn có một bảng được phân vùng và nhiều dữ liệu được sửa đổi chỉ trong một phân vùng. Trước đây, để cập nhật số liệu thống kê trên bảng, bạn sẽ phải xem tất cả các phân vùng. Với tính năng mới này, có thể chỉ cần thu thập số liệu thống kê mới trên phân vùng đã thay đổi. SQL Server có thể cuộn các số liệu thống kê từ các phân vùng thành một đối tượng cấp bảng.
Nếu bạn không thể nâng cấp, bạn có thể xem xét chuyển đổi một số bảng thành dạng xem được phân vùng . Mỗi bảng trong chế độ xem sẽ nhận được các đối tượng thống kê riêng, vì vậy nếu bạn tải dữ liệu theo ngày, bạn có thể chỉ cần cập nhật thống kê trên bảng mới nhất trong chế độ xem thay vì tất cả các bảng của chế độ xem.
Cuối cùng, như đã đề cập trước đó, SQL Server 2016 có thể cập nhật song song các thống kê được lấy mẫu :
Bắt đầu với SQL Server 2016, việc lấy mẫu dữ liệu để xây dựng số liệu thống kê được thực hiện song song, khi sử dụng mức độ tương thích 130, để cải thiện hiệu suất của việc thu thập số liệu thống kê. Trình tối ưu hóa truy vấn sẽ sử dụng thống kê mẫu song song, bất cứ khi nào kích thước bảng vượt quá ngưỡng nhất định.