Statistik Pembaruan Otomatis tidak memperbarui Statistik

8

Saya menggunakan SQL SERVER 2012saya memiliki Auto Update Stats ON saya di database saya.

Dari tautan di bawah ini saya mengetahui bahwa, statistik Pembaruan Otomatis akan diaktifkan untuk setiap SQRT(1000 * Table rows)perubahan dalam baris tabel. https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/

Saya membuat tabel dengan 1000 catatan

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

Membuat statistik

CREATE STATISTICS rn  
    ON stst (rn)  

CREATE STATISTICS name  
    ON stst (name)  

Memeriksa Statistik yang dibuat

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

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

Sesuai formula

select SQRT(1000 * 500) -- 707.106781186548

Jadi, jika saya menambah / memodifikasi 707.106781186548catatan di tabel saya, statistik pembaruan otomatis akan diaktifkan

Tambahkan 1000lebih banyak catatan ke meja saya yang seharusnya lebih dari cukup untuk dipecatauto update stats

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

Untuk menembakkan auto update stats

Select * from stst

Memeriksa statistik

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

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

Sayangnya masih Rowsadalah 500saja.

Bahkan setelah memasukkan 1000catatan ke meja saya yang jelas lebih besar daripada 707.106781186548saat melakukan SELECTmengapa statistik Pembaruan Otomatis tidak diaktifkan? Apa yang kulewatkan di sini

P ரதீப்
sumber
7
Anda melewatkan beberapa hal. Penghitungan yang ditingkatkan hanya digunakan dalam versi sebelum 2016 jika Anda memiliki Trace Flag 2371 pada. Statistik tidak diperbarui ketika data diubah, mereka diperbarui setelah data diubah dan kueri perlu menggunakannya (dengan asumsi mereka telah memenuhi ambang modifikasi).
Erik Darling
7
Juga pertanyaan sepele (mis. SELECT * tanpa klausa WHERE) tidak akan memicu pembaruan statistik. Coba jalankan kueri yang benar-benar membuat mesin melakukan sesuatu di mana statistik mungkin berguna (misalnya Kesetaraan atau rentang pada kolom kunci utama).
Aaron Bertrand
2
@sp_BlitzErik Terima kasih atas info tentang Trace Flag tidak pernah tahu itu ..
P
3
Jangan merasa bodoh, saya belajar sesuatu dari jawaban pertanyaan Anda. Dan saya setuju @sp_BlitzErik dan / atau AaronBertrand harus mengirim jawaban mereka.
SqlZim
8
Saya akan membiarkan @AaronBertrand memposting sebagai jawaban. Dia bisa menggunakan poin.
Erik Darling

Jawaban:

11

Perhitungan baru hanya digunakan jika jejak bendera 2371 diaktifkan, kecuali pada SQL Server 2016 ketika tingkat kompatibilitas basis data konteks diatur ke 130, di mana itu adalah perilaku default. Lihat Microsoft KB 2754171:

Mengontrol perilaku Autostat (AUTO_UPDATE_STATISTICS) dalam SQL Server

Statistik tidak diperbarui ketika data diubah. Pembaruan statistik dipicu ketika optimasi berbasis biaya menemukan bahwa statistik yang menarik untuk kueri basi.

Pengoptimal tidak memasukkan pengoptimalan berbasis biaya untuk kueri yang sangat sederhana ("sepele"), di mana satu rencana jelas selalu optimal. Tidak ada pembaruan statistik yang terjadi dalam skenario itu.

Lihat Microsoft White Paper Plan Caching dan Recompilation di SQL Server 2012 oleh Greg Low.

Paul White 9
sumber