Từ MSDN :
" Thao tác chèn xảy ra trên
các cột khóa tăng dần hoặc giảm dần Thống kê trên các cột khóa tăng dần hoặc giảm dần, chẳng hạn như cột IDENTITY hoặc cột thời gian thực, có thể yêu cầu cập nhật thống kê thường xuyên hơn so với trình tối ưu hóa truy vấn thực hiện. Số lượng hàng được thêm vào có thể quá ít để kích hoạt cập nhật thống kê. Nếu số liệu thống kê không cập nhật và các truy vấn được chọn từ các hàng được thêm gần đây nhất, số liệu thống kê hiện tại sẽ không có ước tính chính cho các giá trị mới này. dẫn đến ước tính cardinality không chính xác và hiệu suất truy vấn chậm.
Ví dụ: một truy vấn được chọn từ các ngày đặt hàng gần đây nhất sẽ có ước tính chính xác về số lượng thẻ nếu số liệu thống kê không được cập nhật để bao gồm các ước tính về số lượng thẻ cho các ngày đặt hàng gần nhất.
Sau các hoạt động bảo trì
Xem xét cập nhật số liệu thống kê sau khi thực hiện các quy trình bảo trì thay đổi phân phối dữ liệu, chẳng hạn như cắt bớt bảng hoặc thực hiện chèn hàng loạt một tỷ lệ lớn các hàng. Điều này có thể tránh sự chậm trễ trong tương lai trong xử lý truy vấn trong khi các truy vấn chờ cập nhật thống kê tự động. "
Thỉnh thoảng bạn có thể sử dụng "EXEC sp_updatestats" trên hệ thống của mình (đã lên lịch) hoặc sử dụng chức năng STATS_DATE trên tất cả các đối tượng và xem khi nào số liệu thống kê của chúng thực sự được cập nhật lần trước và nếu có quá nhiều thời gian kể từ đó, hãy sử dụng CẬP NHẬT THỐNG KÊ cho đối tượng cụ thể đó. Theo kinh nghiệm của tôi, ngay cả khi thống kê Tự động được bật, chúng tôi vẫn buộc phải cập nhật thống kê theo thời gian, vì các hoạt động chèn không kích hoạt cập nhật tự động.
Để thêm mã cá nhân của tôi (được sử dụng trong công việc hàng tuần, xây dựng các báo cáo động để cập nhật thống kê):
select distinct
'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
+ case when stats.RowCnt > 50000 then ' with sample 30 percent;'
else
';' end
as UpdateStatement
from (
select
ss.name SchemaName,
so.name TableName,
so.id ObjectId,
st.name AS StatsName,
STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
, si.RowModCtr
, (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
from sys.stats st
join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
join sys.schemas ss on ss.schema_id = so.uid
) stats
where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
and stats.RowCnt > 0
)
Ở đây tôi nhận được tất cả các đối tượng không có số liệu thống kê được cập nhật trong hơn 3 tháng hoặc kể từ lần cập nhật thống kê cuối cùng, nó đã có hơn 10% số hàng thay đổi.
where col=(cast @var...)
) và@var
có thể'%'
. Tôi mới thừa hưởng nó một hoặc hai tuần trước và cần giữ cho nó hoạt động cơ bản cho đến khi nó được thay thế. Cảm ơn vì liên kết, tôi sẽ cho nó một vòng xoáy.