Kami memiliki aplikasi rak yang menggunakan database Microsoft SQL. Dalam aplikasi ini kami memilih dan memilih berbagai kriteria pemilihan untuk setiap laporan. Aplikasi ini kemudian menjalankan laporan ini.
Saya yakin kami memiliki masalah rencana kueri. Laporan pertama yang kami jalankan setiap hari, berjalan sangat cepat 7 menit. Laporan apa pun yang kami jalankan setelah laporan pertama memakan waktu lebih dari satu jam.
Setiap malam kami menjalankan tugas yang dijadwalkan yang berhenti dan mulai Agen SQL Server dan SQL Server. Ada sekitar 25 database lain dalam contoh SQL Server yang satu ini. Tidak ada database lain yang memiliki masalah kinerja, hanya satu dari produk rak yang saya sebutkan sebelumnya.
Apakah ada cara untuk menghapus semua paket permintaan yang saat ini dimiliki SQL Server di memori?
Bagaimana saya bisa melakukan ini tanpa mempengaruhi 30 atau lebih pengguna yang mengandalkan database lain di server yang sama?
sumber
Jawaban:
Saya minta maaf atas jawaban saya sebelumnya.
1) Tambahkan opsi WITH RECOMPILE ke pernyataan CREATE PROCEDURE jika Anda tahu bahwa kueri Anda akan bervariasi setiap kali dijalankan dari prosedur tersimpan. Opsi WITH RECOMPILE mencegah menggunakan kembali rencana eksekusi prosedur tersimpan, jadi SQL Server tidak men-cache rencana untuk prosedur ini dan prosedur dikompilasi ulang pada saat dijalankan. Menggunakan opsi WITH RECOMPILE dapat meningkatkan kinerja jika kueri Anda akan bervariasi setiap kali dijalankan dari prosedur tersimpan karena dalam kasus ini rencana eksekusi yang salah tidak akan digunakan.
2) Anda harus membuat panduan rencana yang menggunakan petunjuk permintaan USE PLAN untuk setiap jenis permintaan (setiap jenis permintaan prosedur tersimpan) untuk memaksa rencana eksekusi.
Berikut ini adalah artikel tentang rencana eksekusi yang dapat membantu.
sumber
Anda mengajukan dua pertanyaan di sini. Pertama, Anda ingin tahu apakah Anda dapat menghapus semua paket yang tersimpan dalam memori untuk contoh SQL. Itu dilakukan dengan DBCC FREEPROCCACHE seperti yang disarankan Matt M.
Pertanyaan kedua yang Anda ajukan adalah "Bagaimana saya bisa melakukan ini tanpa mempengaruhi 30 atau lebih pengguna yang mengandalkan database lain di server yang sama?". Jawaban singkatnya adalah "kamu tidak bisa". Jika Anda menghapus semua paket daripada pengguna lain yang mengandalkan paket yang ada di memori kemungkinan besar akan mengalami peningkatan kinerja.
Solusi untuk ini memerlukan beberapa intervensi manual. Anda dapat menggunakan DBCC FREEPROCCACHE untuk menghapus paket tertentu asalkan Anda memiliki plan_handle.
Dari apa yang Anda gambarkan di atas, itu terdengar seperti masalah rencana, tetapi saya tidak yakin bahwa menghapus rencana adalah jawabannya. Saya akan mengarahkan Anda ke arah parameter sniffing sebelum berpikir tentang menghapus rencana:
http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx
Anda harus dapat mengoptimalkan kueri daripada bermain-main dengan DBCC FREEPROCCACHE sesuai jadwal. Saya juga menyarankan agar Anda menghabiskan waktu menganalisis acara tunggu untuk contoh Anda.
sumber
DBCC FREEPROCCACHE
Dengan menggunakan perintah ini, Anda dapat menghapus seluruh prosedur cache ke satu perintah. Baca dokumentasi dengan jelas sebelum menggunakan perintah ini. Baca bagian Keterangan beberapa kali.
Mengosongkan cache prosedur akan menyebabkan cache prosedur tersimpan untuk dikompilasi ulang pada penggunaan berikutnya. Ini dapat memengaruhi kinerja. Gunakan dengan hati-hati!
Mat
sumber