Saya memiliki gudang data 200 GB di SQL Server.
Saya telah mengalami waktu eksekusi yang sangat lambat untuk beberapa permintaan; misalnya 12 jam untuk delete
kueri sederhana dengan inner join
.
Setelah melakukan riset dengan rencana eksekusi, saya memperbarui statistik dari 2 tabel yang terlibat dalam kueri, menggunakan WITH FULLSCAN
opsi.
Permintaan sekarang dijalankan dalam waktu kurang dari satu detik, sehingga tampaknya statistik tidak mutakhir.
Saya sedang mempertimbangkan menonaktifkan auto update statistics
pada database dan berjalan UPDATE STATISTICS
secara manual setelah data warehouse dimuat. Gudang data dimuat secara bertahap dari sistem ERP sumber setiap hari, pada malam hari.
Apakah saya benar mengasumsikan auto update statistics
dalam skenario data pergudangan tidak benar-benar berguna? Sebaliknya, apakah lebih masuk akal untuk memperbarui statistik secara manual setelah data dimuat?
Jawaban:
Ini adalah whitepaper pada saat auto_update statistik terjadi . Berikut adalah poin penting vis-a-vis pembaruan otomatis untuk statistik:
Jadi @JNK membuat poin dalam komentar bahwa jika Anda memiliki 1 miliar baris dalam sebuah tabel, Anda harus memiliki 20.000.5000 tulisan di kolom pertama dalam statistik untuk memicu pembaruan.
Mari kita ambil struktur berikut:
Sekarang kita dapat memeriksa untuk melihat apa yang terjadi di tanah statistik.
Namun, untuk melihat apakah ini adalah objek statistik yang bermakna, kita perlu:
Jadi statistik ini belum diperbarui. Itu karena sepertinya statistik tidak diperbarui sampai
SELECT
terjadi dan itupunSELECT
harus berada di luar apa yang SQL Server miliki dalam histogramnya. Berikut ini skrip pengujian yang saya jalankan untuk menguji ini:Alih-alih menonaktifkan statistik auto_update secara membabi buta, saya akan mencoba memeriksa set data Anda untuk condong. Jika data Anda menunjukkan kemiringan yang signifikan, maka Anda perlu mempertimbangkan untuk membuat statistik yang difilter dan kemudian memutuskan apakah mengelola pembaruan statistik secara manual adalah tindakan yang benar.
Untuk menganalisis kemiringan Anda perlu menjalankan
DBCC SHOW_STATISTICS(<stat_object>, <index_name>);
(dalam skrip di atas tanpaWITH STAT_HEADER
) pada kombinasi stat / indeks tertentu yang ingin Anda periksa. Cara cepat untuk melihat kemiringan Anda adalah dengan melihat histogram (set hasil ketiga) dan memeriksa varians diEQ_ROWS
. Jika itu cukup konsisten maka kemiringan Anda minimal. Untuk meningkatkannya, Anda melihatRANGE_ROWS
kolom dan melihat varians di sana karena ini mengukur berapa banyak baris yang ada di antara setiap langkah. Akhirnya, Anda bisa mengambil[All density]
hasil dariDENSITY_VECTOR
(set hasil kedua) dan mengalikannya dengan[Rows Sampled]
nilai dalamSTAT_HEADER
(set hasil pertama) dan melihat apa yang diharapkan rata-rata untuk kueri pada kolom itu. Anda membandingkan rata-rata itu dengan AndaEQ_ROWS
dan jika ada banyak tempat di mana itu bervariasi secara signifikan, maka Anda punya kecenderungan.Jika ternyata Anda memiliki kemiringan, maka Anda perlu mempertimbangkan untuk membuat beberapa statistik yang difilter pada rentang yang sangat tinggi
RANGE_ROWS
sehingga Anda dapat memberikan langkah-langkah tambahan untuk perkiraan yang lebih baik pada nilai-nilai tersebut.Setelah Anda memiliki statistik yang disaring ini, maka Anda dapat melihat kemungkinan memperbarui statistik secara manual.
sumber