Saya mencoba untuk lebih memahami (secara konseptual) hubungan antara statistik, rencana eksekusi, eksekusi prosedur tersimpan.
Apakah saya benar mengatakan bahwa statistik hanya digunakan ketika membuat rencana eksekusi untuk prosedur tersimpan, dan statistik tersebut tidak digunakan dalam konteks eksekusi aktual? Dengan kata lain, jika ini benar, setelah rencana dibuat (dan dengan asumsi itu digunakan kembali dengan benar), seberapa penting statistik "terkini"?
Saya sangat termotivasi oleh artikel yang saya baca ( Statistik, estimasi baris dan kolom tanggal naik ) yang menggambarkan skenario yang sangat mirip dengan yang saya hadapi setiap hari dengan beberapa basis data klien kami.
Kami memiliki kolom tanggal / waktu naik di salah satu tabel terbesar kami yang kami kueri secara teratur menggunakan prosedur tersimpan yang spesifik.
Bagaimana Anda mencegah rencana eksekusi dari basi ketika Anda memiliki seratus ribu baris yang ditambahkan sehari?
Jika kita sering memperbarui statistik untuk mengatasi masalah ini, apakah masuk akal untuk menggunakan petunjuk OPSI (DAPATKAN) pada kueri prosedur tersimpan ini?
Setiap saran atau rekomendasi akan dihargai.
Pembaruan : Saya menggunakan SQL Server 2012 (SP1).
sumber
RECOMPILE
tidak akan menyebabkan pembaruan statistik.Tidak, statistik yang kedaluwarsa dapat menyebabkan rekompilasi terkait optimalitas dari pernyataan yang terpengaruh.
Rencana pelaksanaan yang tidak optimal yang disebabkan oleh nilai predikat berada di luar (khususnya di atas) kisaran nilai yang disimpan dalam histogram statistik yang sesuai dikenal sebagai Masalah Kunci Meningkat . Membangun kembali statistik adalah salah satu solusi yang mungkin, tetapi ini bisa menjadi sumber daya yang cukup intensif. Alternatif termasuk:
Lacak bendera 2389 dan 2390 . Ini mensyaratkan bahwa indeks ada dengan kolom yang bermasalah sebagai kunci utama. Ini tidak bekerja dengan tabel dipartisi, dan hanya efektif di SQL Server 2014 jika estimator kardinalitas asli digunakan. Bendera jejak 4139 juga mungkin diperlukan jika objek statistik dicap stasioner.
Tingkatkan ke SQL Server 2014. Penaksir kardinalitas baru termasuk logika untuk memperkirakan di luar histogram menggunakan informasi kepadatan rata-rata. Ini bisa kurang akurat daripada bendera jejak 2389/2390 dalam beberapa keadaan penting.
Aktifkan pembaruan statistik otomatis yang lebih sering untuk tabel besar dengan bendera jejak 2371 . Dengan tanda jejak ini, alih-alih memperbarui setelah 20% + 500 perubahan, hanya
SQRT(1000 * Table rows)
modifikasi yang diperlukan. Ini bukan solusi yang lengkap seperti yang disebutkan sebelumnya, karena pembaruan mungkin masih belum cukup sering dipicu.Jika sumber masalah Anda bukanlah kompilasi paket yang terlalu sering berdasarkan nilai predikat di luar histogram, tetapi lebih banyak tentang efek sesekali menyimpan caching rencana buruk seperti itu sebagai akibat dari mengendus parameter, Anda juga dapat mempertimbangkan:
OPTIMIZE FOR (@parameter = value)
untuk menyusun rencana untuk nilai representatif yang diketahuiOPTIMIZE FOR (@parameter UNKNOWN)
untuk mengoptimalkan menggunakan distribusi rata-rataOPTIMIZE FOR UNKNOWN
(sama dengan 4136, tetapi per-kueri)OPTION (RECOMPILE)
untuk mengkompilasi setiap waktu, mengendus nilai tertentu. Jika sebagian besar nilai runtime berada dalam histogram, ini mungkin efektif.Untuk informasi lebih lanjut tentang sniffing parameter, embedding, dan opsi kompilasi ulang, lihat artikel saya di SQLperformance.com.
sumber