Apakah saya benar mengatakan bahwa statistik hanya digunakan ketika membuat rencana eksekusi untuk prosedur tersimpan, dan statistik tersebut tidak digunakan dalam konteks eksekusi aktual?
Tidak, yang terjadi adalah bahwa rencana eksekusi untuk prosedur yang tersimpan di-cache. Dengan asumsi ada cukup memori yang tersedia untuk terus memegang rencana, itu tidak akan berubah kecuali salah satu dari yang berikut terjadi (dari Caching dan Penggunaan Kembali Rencana Eksekusi dalam dokumentasi SQL Server, penekanan ditambahkan):
- Perubahan yang dilakukan pada tabel atau tampilan yang dirujuk oleh kueri (ALTER TABLE dan ALTER VIEW).
- Perubahan dibuat untuk satu prosedur, yang akan menghapus semua paket untuk prosedur itu dari cache (ALTER PROCEDURE).
- Perubahan pada indeks apa pun yang digunakan oleh rencana eksekusi.
- Pembaruan pada statistik yang digunakan oleh rencana eksekusi, dihasilkan baik secara eksplisit dari pernyataan, seperti STATISTIK PEMBARUAN, atau dihasilkan secara otomatis.
- Menjatuhkan indeks yang digunakan oleh rencana eksekusi.
- Panggilan eksplisit ke sp_recompile.
- Sejumlah besar perubahan pada kunci (dihasilkan oleh pernyataan INSERT atau DELETE dari pengguna lain yang memodifikasi tabel yang dirujuk oleh kueri).
- Untuk tabel dengan pemicu, jika jumlah baris dalam tabel yang dimasukkan atau dihapus tumbuh secara signifikan.
- Menjalankan prosedur tersimpan menggunakan opsi WITH RECOMPILE.
Jadi, jika statistik diperbarui, rencana yang di-cache akan secara otomatis memasukkan statistik baru ke dalam akun dan dikompilasi ulang.
Bagaimana Anda mencegah rencana eksekusi dari basi ketika Anda memiliki seratus ribu baris yang ditambahkan sehari?
Salah satu caranya adalah jika ada banyak pembaruan pada tabel, seperti yang disebutkan di atas. Beberapa ratus ribu baris yang diubah dapat memenuhi kondisi ini. Tetapi jika Anda ingin memastikan atau memiliki kontrol lebih rinci: dengan memperbarui statistik Anda. Anda dapat mengizinkan SQL Server untuk membuat dan mengelola statistik secara otomatis, atau melakukannya sendiri secara manual. Anda dapat menemukan lebih banyak info tentang metode mana pun di Pembaruan Otomatis SQL Server dan Opsi Statistik Buat Otomatis . Ketika / jika Anda melakukan pembangunan kembali indeks mingguan, ini juga akan memicu rencana untuk diperbarui juga. Lakukan beberapa pengujian untuk melihat apa yang paling bermanfaat bagi Anda, karena memperbarui statistik terlalu sering mungkin tidak menghasilkan hasil kinerja nyata.
Jika kita sering memperbarui statistik untuk mengatasi masalah ini, apakah masuk akal untuk menggunakan petunjuk OPSI (DAPATKAN) pada kueri prosedur tersimpan ini?
Anda tidak perlu menggunakan RECOMPILE
, karena berdasarkan kutipan di atas Anda dapat melihat bahwa rencana eksekusi diperbarui dengan tepat setiap kali statistik baru tersedia. Anda mungkin baik-baik saja dengan pembaruan statistik akhir hari (jika Anda benar-benar peduli) tetapi saya tidak berpikir itu secara eksplisit merupakan kebutuhan berdasarkan apa yang telah Anda katakan sejauh ini. Namun, sekali lagi, saya akan mengujinya untuk melihat dampak apa yang mungkin terjadi pada kinerja prosedur tersimpan Anda dan merencanakannya.
RECOMPILE
tidak akan menyebabkan pembaruan statistik.