SQL Server membuat ulang rencana setiap hari

14

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.

peter.petrov
sumber
3
plancache dapat dilepaskan baik ketika mesin berada di bawah tekanan memori atau jika Anda mengubah pengaturan tingkat ob db. (ubah db). Karena Anda mengatakan Anda tidak menghapusnya "secara manual" saya menganggap itu mungkin karena tekanan memori. Berapa banyak memori yang dimiliki mesin? apa pengaturan memori maks Anda? apakah Anda memiliki lingkungan virtual dan mungkin keseluruhan RAM?
RayofCommand
6
Kenapa kamu di SP1. Sebelum Anda melakukan hal apa pun, terapkan SP3. SQL Server dapat memaksa rencana keluar jika menemukan tekanan memori dan perlu lebih banyak memori untuk mengakomodasi halaman khusus dari indeks membangun kembali khususnya jika Anda memiliki tabel besar. Pembangunan kembali indeks akan mencoba membawa halaman sebanyak mungkin. Yang bisa Anda lakukan adalah berhenti menggunakan MP dan gunakan solusi Ola Hallengren dan lihat apakah ini membantu. Apa itu memori server maks?
Shanky
1
Guys, saya bukan DBA, hanya pengembang SQL. Saya hanya menanyakan semua ini karena sudah berlangsung cukup lama. Terima kasih atas komentar Anda, saya akan mencoba untuk menanggapi semuanya, meskipun untuk saat ini saya merasa sulit untuk mengikuti (dan semuanya tampak jelas bagi Anda). Apa itu MP?
peter.petrov
1
@ peter.petrov kami berusaha membantu Anda dengan mengenal lingkungan Anda. MP = Rencana Perawatan.
Kin Shah
1
Masalah sebenarnya adalah bahwa rencana kueri Anda sangat rapuh. Rekompilasi dapat terjadi kapan saja, bahkan di siang hari. Tidak ada jaminan Perbaiki kueri Anda sehingga rencana menjadi stabil. OPSI RECOMPILE atau OPTIMIZE FOR UNKNOWN adalah pendekatan palu godam yang bisa tepat dan menjadi perbaikan cepat.
usr

Jawaban:

2

Yah saya punya beberapa ide yang dapat menyebabkan perilaku ini.

  1. Apakah Anda memonitor tekanan memori Anda? Mungkin pertanyaan Anda menaikkan batas tertentu yang akan menyebabkan flush cache rencana. Saya tidak tahu aplikasi Anda, tetapi apakah ini koresponden dengan log Anda dari server frontend Anda? Apakah ada tekanan juga selama ini?
  2. Apakah Anda memiliki SQL Server khusus atau apakah server membagikan perangkat kerasnya dengan proses / layanan lain? Jika tidak, coba pertimbangkan untuk mengalihdayakan SQL Server Anda ke mesin khusus. Ini akan mengurangi efek samping dari layanan lain.
  3. Anda mungkin ingin menggunakan 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 menggunakan sp_configure 'optimize for ad hoc workloads',1; reconfigure. Ini dapat dilakukan jika Anda telah mengaktifkan advanced optionspenggunaan sp_configure 'show advanced options',1; reconfigure.
  4. Gagasan lain bisa berupa cadangan. Cadangan sederhana. Jika mereka agresif, mungkin mesin Anda mendapat tekanan juga. Waktu menyebutkan Anda hanya terdengar seperti rentang waktu yang baik untuk merencanakan cadangan.
  5. Mungkin itu bug yang cukup sederhana di skrip pemeliharaan Anda. Sudahkah Anda memeriksa apakah ada masalah logis yang menyebabkan skrip Anda membangun kembali semua indeks, bukan hanya mereka yang cocok dengan kriteria. Ini mungkin bisa menyebabkannya juga.

Di samping semua kemungkinan ini, mungkin berguna untuk memeriksa file log untuk beberapa perubahan pada opsi affinity mask, affinity I/O maskdan mitra x64 mereka. Hal lain dapat berupa perubahan MAXDOPopsi 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 perfmonadalah 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.

Ionik
sumber