Saya memperbaiki masalah kinerja pada prosedur tersimpan multistatement di SQL Server. Saya ingin tahu bagian mana yang harus saya habiskan.
Saya mengerti dari Bagaimana saya membaca Biaya Permintaan, dan apakah selalu berupa persentase? bahwa bahkan ketika SSMS diberitahu untuk menyertakan Rencana Eksekusi Aktual , angka "Biaya kueri (relatif terhadap bets)" masih didasarkan pada perkiraan biaya , yang mungkin jauh dari aktual
Saya mengerti dari Mengukur Kinerja Kueri: "Biaya Permintaan Rencana Eksekusi" vs "Waktu Diambil" bahwa saya dapat mengelilingi permohonan prosedur tersimpan dengan SET STATISTICS TIME
pernyataan, dan kemudian saya akan mendapatkan daftar seperti ini di Messages
panel:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
[etc]
SQL Server Execution Times:
CPU time = 187 ms, elapsed time = 206 ms.
dengan satu pesan keluaran untuk setiap pernyataan.
Saya dapat 'dengan mudah' (walaupun tidak dengan mudah) mengaitkan output statistik waktu dengan rencana pelaksanaan pernyataan demi pernyataan di panel rencana Eksekusi, dengan menghitungnya: SQL Server Execution Times
Output pesan keempat sesuai dengan Query 4
di panel rencana Eksekusi, dan seterusnya.
Tetapi apakah ada cara yang lebih baik?
Duration
danCPU
lebih aktual daripada perkiraan, ya?Salah satu cara yang baik untuk melakukan ini adalah dengan Profiler. Atur "repro" dari proc Anda pada dev atau kotak tes, yaitu contoh panggilan ke proc dengan parameter. Kemudian menggunakan Profiler, buat jejak menggunakan templat TSQL_SPs, atau dari templat kosong, tambahkan SP: acara StmtCompleted. Tambahkan kolom Durasi, Baca, Tulis, dan CPU jika belum tersedia. Tambahkan filter ke jejak pada SPID Anda (yang harus Anda ketahui dari Management Studio). Anda juga dapat menambahkan filter ke Durasi (mis. Lebih besar dari 1000 = lebih dari 1 detik).
Anda dapat menjalankan penelusuran di Profiler meskipun ada overhead (JANGAN lakukan ini di kotak produksi) atau ekspor definisi dan buat jejak sisi server. Overhead Profiler bukan masalah besar pada dev atau kotak uji khusus.
Jalankan proc dan biarkan selesai. Anda juga dapat mengumpulkan rencana Eksekusi Aktual pada saat ini.
Hentikan jejak Anda dan buka file tersebut, dan Anda akan melihat perincian baris demi baris dari proc Anda, termasuk pengaturan waktu untuk setiap langkah. Saya menemukan ini lebih berguna daripada rencana untuk mengidentifikasi kemacetan meskipun rencana akan berguna ketika melihat bagian yang relevan untuk diperbaiki.
HTH
sumber
Anda juga bisa menggunakan sys.dm_exec_procedure_stats dan sys.dm_exec_query_stats pandangan manajemen dinamis. Yang pertama memberikan informasi tentang prosedur secara keseluruhan; yang kedua dapat digunakan untuk memecahkan setiap permintaan dalam prosedur. Contohnya ditunjukkan di bawah ini:
Statistik prosedur:
Pertanyaan dalam prosedur:
sumber