Bagaimana Anda menghapus semua paket permintaan lama dari dalam Microsoft SQL Server?

12

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?

Michael Riley - AKA Gunny
sumber

Jawaban:

7

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.

garik
sumber
Saya setuju menggunakan DENGAN RECOMPILE, saya sudah melakukan ini dengan sistem yang saya bangun. Namun, saya tidak memiliki akses ke sumber sql ... dijalankan dari dalam suatu aplikasi.
Michael Riley - AKA Gunny
@Cape Cod Goni dalam hal ini coba DBCC FLUSHPROCINDB: Digunakan untuk menghapus cache prosedur tersimpan untuk database tertentu pada SQL Server, bukan seluruh SQL Server. Anda mungkin ingin menggunakan perintah ini sebelum pengujian untuk memastikan bahwa rencana prosedur tersimpan sebelumnya tidak akan mempengaruhi hasil pengujian secara negatif. Contoh: DECLARE @intDBID INTEGER SET @intDBID = (PILIH dbid DARI master.dbo.sysdatabases WHERE name = 'database_name') DBCC FLUSHPROCINDB (@intDBID)
garik
masalah telah diatasi. Ternyata tabel temp yang digunakan untuk menyimpan kriteria pencarian terus-menerus mengumpulkan data. Proses seharusnya memotong data dari tabel ini sebelum mengumpulkan data. Terima kasih atas cuplikan sql yang bagus.
Michael Riley - AKA Gunny
13

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.

SQLRockstar
sumber
DBCC FREEPROCCACHE tidak menyelesaikan masalah. Saya melakukan monitori terhadap aktivitas dan acara-acara tersebut. Ada 0 I / O fisik. Tampaknya tergantung pada aplikasi ini:. Penyedia Data Klien Sql Net. Jenis menunggu adalah CXPACKET.
Michael Riley - AKA Gunny
CXPACKET menyiratkan permintaan Anda berjalan paralel. Bisakah Anda memastikan berapa banyak utas berjalan untuk kueri, dan memeriksa menunggu mereka? Anda mungkin ingin menggunakan alat bantu gratis Adam Machanic, WhoIsActive, sqlblog.com/files/folders/release/entry29675.aspx .
SQLRockstar
7

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

Matt M
sumber
Saya mencoba menggunakan DBCC FREEPROCCACHE dan itu tidak menyelesaikan masalah. Saya akhirnya membunuh proses setelah 1 jam.
Michael Riley - AKA Gunny