Kecocokan menggunakan STATISTICS_NORECOMPUTE

9

Saya baru-baru ini terlibat dalam memelihara satu set database dengan beberapa masalah indeks yang menarik. Salah satu yang paling memperburuk saya adalah perbedaan indeks antara pengembangan, pengujian, model dan mesin produksi. Karena perbedaan membuat penyetelan kueri agak sulit menyinkronkannya adalah salah satu proyek pertama saya.

Karena saya telah membandingkan lingkungan pengujian dan model, saya perhatikan bahwa sebagian besar indeks dalam lingkungan model telah STATISTICS_NORECOMPUTEditetapkan, ONsedangkan yang dalam pengujian tidak. Di semua lingkungan ada pekerjaan malam yang memperbarui statistik semua basis data.

Saya tidak pernah berurusan dengan STATISTICS_NORECOMPUTEsebelumnya jadi inilah pertanyaan saya. Apakah ada praktik terbaik saat menangani pengaturan ini? Jika saya melakukan pembaruan statistik pada akhir hari, apakah yang terbaik adalah menyerahkan STATISTICS_NORECOMPUTEsemua lingkungan pada semua indeks? Atau ada alasan bagus untuk tidak melakukannya?

EDIT: Saya telah menemukan salah satu blog Kimberly Tripp pada subjek di sini yang tampaknya menyarankan yang STATISTICS_NORECOMPUTEharus digunakan hemat. Tetapi saya masih khawatir tentang mematikannya secara global. Adakah yang pernah mencoba ini dan apa yang mereka alami?

Kenneth Fisher
sumber
Anda harus melihat aplikasi ini untuk mempercayainya. Beberapa tabel memiliki lusinan indeks, beberapa tidak, beberapa memiliki duplikat ganda. Benar-benar berantakan. Adakah pedoman umum untuk digunakan? Di mana saya bisa membaca?
Kenneth Fisher
1
Satu kasus yang baik adalah menggunakan STATISTICS_NORECOMPUTE = ON dan FILLFACTOR = 100 untuk tabel pencarian hanya-baca yang hanya diubah oleh DBA menggunakan skrip yang melakukan INDEX MEMBANGUN Kembali dengan FULLSCAN setelah perubahan; kemudian tabel dalam kondisi optimal dengan statistik optimal, dan tanpa perubahan lain, tidak ada alasan untuk mempertimbangkan perhitungan ulang statistik, atau menyisakan ruang untuk mengurangi pemisahan halaman pada perubahan di masa mendatang.
Kata sandi anti-lemah

Jawaban:

4

Ini benar-benar hal situasional yang ingin Anda lihat per-tabel atau per-indeks, dan Anda benar-benar perlu mencari tahu apa yang ada di produksi sebelum mengambil tindakan apa pun. Jika ragu, gunakan apa yang diproduksi di lingkungan lain, juga, meskipun itu berarti menggunakan banyak pengaturan gila. Anda hanya tidak bisa merasakan dengan baik bagaimana produksi akan berperilaku jika ada perbedaan dalam pengujian atau pengembangan.

Bagaimanapun, rekomendasi umum untuk membiarkan statistik pemutakhiran otomatis dihidupkan ( STATISTICS_NORECOMPUTE = OFF, yang merupakan default) adalah untuk alasan keamanan, karena jika ini dimatikan dan tidak ada yang memperbarui statistik secara manual, hasilnya dapat menjadi rencana eksekusi yang benar-benar menghebohkan yang tidak pernah berubah setelah pertama kali dibuat (dan jangan dibatalkan karena alasan lain di kemudian hari).

Anda mengatakan statistik pembaruan otomatis dimatikan untuk sebagian besar indeks (saya pikir saya awalnya salah membaca itu semua , tidak sebagian besar ). Untuk indeks dengan statistik pembaruan otomatis masih diaktifkan, apakah pengaturan ini masuk akal mengingat aktivitas di tabel itu? Saya berharap ini adalah tabel dengan aktivitas lebih tinggi. Mungkin banyak pekerjaan yang harus dilakukan untuk mencari tahu, dan mungkin perlu untuk menjaga (atau sangat mempertimbangkan) pengaturan tersebut. Paling tidak, buatlah catatan statistik mana ini, karena informasi itu bisa berguna di jalan.

Memikirkannya lebih lanjut, saya akan mengatakan bahwa strategi saat ini memang masuk akal. Apakah lebih baik daripada membiarkan statistik pemutakhiran otomatis menyala untuk semuanya? Tampaknya seseorang berpikir begitu, sampai-sampai itu sepadan dengan kemudahan trade-off manajemen memiliki pekerjaan SQL Agent terkait.

Jika idenya adalah untuk menyediakan statistik baru tanpa memblokir kueri (seperti ini ), Anda dapat mempertimbangkan mengaktifkan kembali pembaruan otomatis untuk semuanya, dan kemudian juga menghidupkannya AUTO_UPDATE_STATISTICS_ASYNC. Maka mungkin ubah jadwal pekerjaan agar berjalan sekali / minggu daripada setiap hari, karena Anda masih ingin statistik diperbarui WITH FULLSCANsecara berkala.

Namun, saya mungkin meninggalkannya, karena Anda mungkin memiliki ikan yang lebih besar untuk digoreng jika indeksnya berbeda di antara lingkungan, dan statistik yang dibangun kembali tidak terlalu menyakitkan. Apa yang ada di sana sekarang masuk akal; Anda hanya perlu membuat hal-hal konsisten di seluruh lingkungan. Mungkin sedikit lebih baik daripada pengaturan sederhana yang saya sarankan, dengan mengorbankan lebih banyak pekerjaan yang dilakukan. Tetapi cari tahu apa yang ada dalam produksi, cenderung menggunakan itu, dan beralih ke hal-hal yang lebih penting; kunjungi kembali ini saat Anda berada di titik yang membutuhkan kinerja yang lebih bagus - statistik terbaik di dunia tidak akan menyimpan kueri yang tidak memiliki indeks kritis.

Jon Seigel
sumber
oops ... saya pikir saya memilih untuk tidak mengirimkan komentar ini.
swasheck