Dari MSDN :
" Sisipkan Operasi yang Terjadi pada Menanjak atau Menurun Kolom Kunci
Statistik pada kolom kunci naik atau turun, seperti IDENTITY atau kolom timestamp waktu-nyata, mungkin memerlukan pembaruan statistik yang lebih sering daripada yang dilakukan pengoptimal query. Memasukkan operasi menambahkan nilai baru ke kolom naik atau turun. Jumlah baris yang ditambahkan mungkin terlalu kecil untuk memicu pembaruan statistik. Jika statistik tidak mutakhir dan kueri pilih dari baris yang paling baru ditambahkan, statistik saat ini tidak akan memiliki perkiraan kardinalitas untuk nilai-nilai baru ini. menghasilkan perkiraan kardinalitas yang tidak akurat dan kinerja kueri yang lambat.
Misalnya, permintaan yang memilih dari tanggal pesanan penjualan terbaru akan memiliki perkiraan kardinalitas yang tidak akurat jika statistik tidak diperbarui untuk menyertakan perkiraan kardinalitas untuk tanggal pesanan penjualan terbaru.
Setelah Operasi Pemeliharaan
Pertimbangkan untuk memperbarui statistik setelah melakukan prosedur perawatan yang mengubah distribusi data, seperti memotong tabel atau melakukan penyisipan massal sebagian besar baris. Ini dapat menghindari penundaan di masa depan dalam pemrosesan permintaan sementara permintaan menunggu pembaruan statistik otomatis. "
Anda dapat menggunakan "EXEC sp_updatestats" dari waktu ke waktu di sistem Anda (dijadwalkan beberapa waktu) atau menggunakan fungsi STATS_DATE pada semua objek dan melihat kapan statistik mereka benar-benar diperbarui terakhir kali dan jika ada terlalu banyak waktu sejak saat itu, gunakan UPDATE STATISTIK untuk objek tertentu. Dalam pengalaman saya, bahkan dengan statistik Otomatis diaktifkan kami masih dipaksa untuk memperbarui statistik dari waktu ke waktu, karena operasi penyisipan yang tidak memicu pembaruan otomatis.
Untuk menambahkan kode pribadi saya (digunakan dalam pekerjaan mingguan yang membuat pernyataan dinamis untuk pembaruan statistik):
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
)
Di sini saya mendapatkan semua objek di mana statistik tidak diperbarui selama lebih dari 3 bulan atau sejak statistik terakhir diperbarui memiliki lebih dari 10% dari baris diubah.
where col=(cast @var...)
) dan@var
mungkin'%'
. Saya baru saja mewarisinya satu atau dua minggu yang lalu, dan pada dasarnya harus tetap berfungsi sampai diganti. Terima kasih untuk tautannya, saya akan berputar.