Statistik Pembaruan Otomatis di SQL Server 2008R2: Mengapa beberapa statistik tetap basi meskipun sejumlah besar sisipan baris?

10

Selama penyelidikan permintaan lambat, tampak bahwa rencana eksekusi sangat suboptimal (Loop bersarang melakukan 9 juta eksekusi pencarian di mana perkiraan jumlah eksekusi adalah 1). Setelah mengkonfirmasi bahwa beberapa statistik yang relevan di mana memang ketinggalan zaman saya membangun kembali statistik dan masalah kinerja diselesaikan secara efektif.

Database ini memiliki Statistik Pembaruan Otomatis diaktifkan (diaktifkan secara default). Saya mengerti ada ambang untuk pembaruan statistik otomatis berdasarkan ada 20% + 500 modifikasi baris (perbarui / masukkan / hapus). Ambang batas ini tampaknya telah dilampaui oleh gelar besar pada banyak indeks, karena tampaknya ada (A) masalah dengan pembaruan otomatis atau (B) Ada lebih banyak strategi pembaruan daripada yang dapat saya temukan di online dokumentasi.

Saya menghargai bahwa tugas yang dijadwalkan dapat diatur untuk memperbarui statistik dan ini kemungkinan akan menjadi pendekatan yang kami ambil jika tidak ada solusi lain yang ditemukan, tetapi itu membuat kami bingung mengapa sejumlah besar modifikasi tidak akan memicu suatu perbarui otomatis untuk beberapa statistik - memahami mengapa mungkin membantu kami untuk memutuskan statistik mana yang perlu diperbarui oleh tugas yang dijadwalkan.

Beberapa catatan tambahan:

1) Masalahnya dicatat dalam database di mana data sedang dibuat oleh uji beban dan dengan demikian sejumlah besar data ditambahkan dalam waktu singkat, sehingga jika pembaruan otomatis terjadi secara berkala (misalnya sekali sehari pada sebagian besar) maka ini dapat menjelaskan beberapa perilaku yang diamati. Juga tes beban kami cenderung sangat menekankan database, oleh karena itu saya bertanya-tanya apakah SQL menunda pembaruan statistik sementara ada beban berat (dan kemudian tidak memperbarui statistik untuk beberapa alasan).

2) Dalam mencoba menciptakan kembali masalah ini dengan skrip uji yang berisi pernyataan INSERT, SELECT, dan DELETE yang berurutan masalah tidak terjadi. Saya bertanya-tanya apakah perbedaannya di sini adalah bahwa pernyataan ini masing-masing memengaruhi banyak baris per pernyataan SQL, sedangkan skrip uji beban kami akan cenderung menyisipkan baris secara terpisah.

3) DB yang dimaksud diatur ke model pemulihan 'Sederhana'.

Beberapa tautan yang relevan:

Saya juga telah mengangkat masalah ini melalui microsoft connect:

UPDATE 2011-06-30:

Pada penyelidikan lebih lanjut saya percaya bahwa statistik yang kedaluwarsa di luar tingkat ambang (misalnya 500 baris + 20%) adalah statistik yang tidak digunakan oleh kueri masalah, maka mereka mungkin akan diperbarui ketika kueri dijalankan itu menuntut mereka. Untuk statistik yang sedang digunakan oleh query, ini sedang diperbarui secara teratur. Masalah yang tersisa kemudian adalah bahwa statistik ini sangat menyesatkan ke pengoptimal rencana kueri setelah hanya menyisipkan relatif sedikit (misalnya menyebabkan 9 juta tersebut atau lebih mencari di mana angka yang diperkirakan adalah 1).

Firasat saya saat ini adalah bahwa masalahnya terkait dengan pilihan kunci primer yang buruk, kuncinya adalah pengidentifikasi unik yang dibuat menggunakan NEWID (), dan karena itu membuat indeks yang sangat terfragmentasi dengan sangat cepat - terutama sebagai faktor pengisian default dalam SQL Server adalah 100%. Firasat saya adalah bahwa ini entah bagaimana menghasilkan statistik yang menyesatkan setelah sisipan baris yang relatif sedikit - kurang dari ambang untuk menghitung ulang statistik. Ini semua mungkin bukan masalah karena saya telah menghasilkan banyak data tanpa membangun kembali sebagian indeks, maka statistik yang buruk mungkin merupakan konsekuensi dari fragmentasi indeks yang dihasilkan sangat tinggi. Saya pikir saya perlu menambahkan siklus pemeliharaan SQL Server ke dalam tes beban saya untuk mendapatkan ide yang lebih baik tentang kinerja pada sistem nyata selama periode waktu yang lama.

UPDATE 2012-01-10:

Faktor lain yang perlu dipertimbangkan. Dua tanda jejak ditambahkan ke SQL Server 2005 (dan tampaknya masih ada pada tahun 2008) untuk mengatasi kekurangan spesifik terkait dengan terjadinya statistik yang ketinggalan jaman dan / atau menyesatkan. Bendera yang dimaksud adalah:

DBCC TRACEON(2389)
DBCC TRACEON(2390)

MSDN: WebLog Ian Jose: Tombol Naik dan Statistik Statistik Koreksi Cepat Otomatis pada Kolom Naik, Fabiano Amorim

Tentu saja Anda harus sangat berhati-hati ketika memutuskan untuk mengaktifkan bendera ini karena mungkin memiliki efek yang merugikan.

redcalx
sumber

Jawaban:

8

Beberapa info, jika bukan jawaban yang pasti

Sudah di-blog baru-baru ini

Ada whitepaper juga. Lihat bagian "Menjaga Statistik di SQL Server 2008" di mana ada beberapa kondisi yang sepertinya mempengaruhi Anda. Contoh:

Salah satu batasan dari logika pembaruan otomatis adalah bahwa ia melacak perubahan ke kolom dalam statistik, tetapi tidak berubah ke kolom dalam predikat. Jika ada banyak perubahan pada kolom yang digunakan dalam predikat statistik yang difilter, pertimbangkan untuk menggunakan pembaruan manual untuk mengikuti perubahan.

Pada akhirnya ada beberapa pengaturan untuk diperiksa juga: bagaimana jika OFF pada level DB yang menimpa ON pada level indeks / stat?

HTH ...

gbn
sumber