Thống kê tự động cập nhật không cập nhật Thống kê


8

Đang sử dụng SQL SERVER 2012Tôi có Auto Update Stats ON của tôi trong cơ sở dữ liệu của tôi.

Từ liên kết bên dưới tôi đã học được rằng, các thống kê Cập nhật tự động sẽ kích hoạt cho mọi SQRT(1000 * Table rows)thay đổi trong các hàng của bảng. https://bloss.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistic-explained/

Tôi đã tạo một bảng với 1000 bản ghi

SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                name
INTO   stst
FROM   sys.objects 

Tạo số liệu thống kê

CREATE STATISTICS rn  
    ON stst (rn)  

CREATE STATISTICS name  
    ON stst (name)  

Kiểm tra số liệu thống kê đã tạo

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Theo công thức

select SQRT(1000 * 500) -- 707.106781186548

Vì vậy, nếu tôi thêm / sửa đổi 707.106781186548các bản ghi trong bảng thống kê cập nhật tự động của mình sẽ kích hoạt

Thêm 1000nhiều bản ghi vào bảng của tôi, quá đủ để bắnauto update stats

INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                a.name
FROM   sys.objects a 

Để bắn auto update stats

Select * from stst

Kiểm tra số liệu thống kê

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Thật không may vẫn chỉ Rows500.

Ngay cả sau khi chèn 1000các bản ghi vào bảng của tôi rõ ràng là lớn hơn 707.106781186548trong khi thực hiện SELECTtại sao các số liệu thống kê Tự động cập nhật không kích hoạt? Tôi đang thiếu gì ở đây


7
Bạn đang thiếu một vài điều. Tính toán được cải thiện chỉ được sử dụng trong các phiên bản trước năm 2016 nếu bạn có Trace Flag 2371. Số liệu thống kê không cập nhật khi dữ liệu được sửa đổi, chúng cập nhật sau khi dữ liệu được sửa đổi và một truy vấn cần sử dụng chúng (giả sử chúng đã đáp ứng ngưỡng sửa đổi).
Erik Darling

7
Ngoài ra, một truy vấn tầm thường (ví dụ: CHỌN * không có mệnh đề WHERE) sẽ không kích hoạt cập nhật thống kê. Hãy thử chạy một truy vấn thực sự làm cho công cụ thực hiện điều gì đó trong đó các số liệu thống kê có thể hữu ích (ví dụ: Bình đẳng hoặc phạm vi trên cột khóa hàng đầu).
Aaron Bertrand

2
@sp_BlitzErik Cảm ơn thông tin về Trace Flag không bao giờ biết điều đó ..
P 21/12/2016

3
Đừng cảm thấy ngu ngốc, tôi đã học được điều gì đó từ câu trả lời cho câu hỏi của bạn. Và tôi đồng ý @sp_BlitzErik và / hoặc AaronBertrand nên đăng câu trả lời của họ.
SqlZim

8
Tôi sẽ để @AaronBertrand đăng bài của mình làm câu trả lời. Anh ta có thể sử dụng các điểm.
Erik Darling

Câu trả lời:


11

Tính toán mới chỉ được sử dụng nếu cờ theo dõi 2371 được bật, ngoại trừ trên SQL Server 2016 khi mức độ tương thích cơ sở dữ liệu bối cảnh được đặt thành 130, trong đó đó là hành vi mặc định. Xem Microsoft KB 2754171:

Kiểm soát hành vi Tự động điều khiển (AUTO_UPDATE_STATISTICS) trong SQL Server

Thống kê không được cập nhật khi dữ liệu được sửa đổi. Một cập nhật thống kê được kích hoạt khi tối ưu hóa dựa trên chi phí thấy rằng các thống kê thú vị cho truy vấn đã cũ.

Trình tối ưu hóa không nhập tối ưu hóa dựa trên chi phí cho các truy vấn rất đơn giản ("tầm thường"), trong đó một kế hoạch rõ ràng duy nhất luôn tối ưu. Không có cập nhật thống kê xảy ra trong kịch bản đó.

Xem Bộ nhớ đệm và biên dịch lại gói trắng của Microsoft trong SQL Server 2012 của Greg Low.

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.