Kami memiliki masalah ini di lingkungan produksi kami.
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) - Edisi Perusahaan (64-bit) pada Windows NT 6.1 (Build 7601: Service Pack 1).
SQL Server menjatuhkan semua (hampir 100%) dari rencana eksekusi yang lama dan membuatnya kembali setiap hari dalam semalam (dari jam 11:00 hingga 8:00). Ini bahkan terjadi ketika 'statistik pembaruan otomatis' dalam keadaan dinonaktifkan. Kami telah mengaktifkan 'statistik pembaruan otomatis' selama 2-3 minggu terakhir. Tapi itu masih terjadi.
Kami tidak benar-benar tahu apa yang memicu rencana re-generasi ini, tetapi kami yakin kami tidak melakukannya secara manual.
Satu-satunya hal yang benar-benar bertepatan dengan waktu rencana regenerasi adalah pekerjaan pemeliharaan DB yang kita miliki: indeks harian reorganisasi (ketika fragmentasi 5-30%), dan indeks harian dibangun kembali (ketika fragmentasi lebih dari 30% ) pekerjaan. Biasanya pekerjaan pemeliharaan harian ini hanya mengatur ulang (karena fragmentasi indeks tidak pernah lebih dari 30% setiap hari).
Dampak:
Paket yang baru dibuat ini membuat beberapa panggilan UDF / panggilan permintaan (yang dipanggil dari UI / halaman web) membutuhkan waktu lebih lama (menit dibandingkan dengan kurang dari 1 detik), sehingga sesi hanya ditumpuk dengan mengambil CPU hampir 90% .
Masalahnya hilang saat sesi yang macet itu dihapus secara paksa (di sisi DB), dan 1) ketika semua rencana eksekusi yang terkait dihapus secara manual (untuk kueri) atau 2) ketika UDF diubah (untuk fungsi). Setiap rencana baru yang dibuat oleh SQL server sejak saat itu berfungsi sempurna sepanjang hari sampai akhirnya memiliki masalah yang sama keesokan paginya. Juga, perilaku ini tidak 100% konsisten, kita tidak benar-benar melihatnya setiap pagi. Tetapi ada periode waktu di mana kita telah melihatnya secara konsisten selama 4-5 hari berturut-turut.
Masalahnya terjadi pada pagi hari bisnis, saat itulah UI / halaman web diakses lebih intensif, sepertinya.
Adakah yang tahu apa yang menyebabkan ini dan bagaimana mengatasi masalah ini? Bantuan apa pun akan sangat dihargai.
sumber
Jawaban:
Yah saya punya beberapa ide yang dapat menyebabkan perilaku ini.
optimize for ad hoc workloads
, yang hanya akan menyimpan rintisan paket dan kompilasi jika diperlukan. Ini akan mengurangi beban plancache Anda, yang akan menurunkan kemungkinan flushing plancache. Anda dapat mengaktifkannya menggunakansp_configure 'optimize for ad hoc workloads',1; reconfigure
. Ini dapat dilakukan jika Anda telah mengaktifkanadvanced options
penggunaansp_configure 'show advanced options',1; reconfigure
.Di samping semua kemungkinan ini, mungkin berguna untuk memeriksa file log untuk beberapa perubahan pada opsi
affinity mask
,affinity I/O mask
dan mitra x64 mereka. Hal lain dapat berupa perubahanMAXDOP
opsi instance Anda. Silakan periksa log untuk mereka juga. Mereka juga perlu menyiram plancache.Terakhir namun tidak kalah pentingnya, Anda masih dapat menjalankan jejak sisi server (cukup dengan menggunakan profiler, jalankan, hentikan dan gunakan perintah sql untuk memulainya lagi di sisi server). Di samping itu
perfmon
adalah temanmu. Itu dapat menonton dan memantau nilai kinerja Anda untuk sementara waktu. Mungkin Anda bisa melihat persamaan dalam tekanan dengan tindakan tertentu di server Anda yang dapat menyebabkan flush.Semoga ini akan membantu Anda, bahkan jika jawabannya datang sedikit kemudian.
sumber