Cara Menyimpan Prosedur Profil

26

Saya menggunakan SQL Server 2012 dan bertanya-tanya bagaimana profil prosedur tersimpan

Misalnya dapatkah profiler menangkap setiap pernyataan SQL individu dalam prosedur tersimpan, apa itu, dan berapa lama waktu yang diperlukan untuk menjalankan dll?

Saya mencoba mendiagnosis prosedur tersimpan replikasi gabungan, dan ini harus diambil sebagai bagian dari menjalankan sepenuhnya agen gabungan. Tampaknya tidak mungkin untuk mengambil prosedur tersimpan dengan masalah kinerja dan menjalankannya lagi karena pada saat itu tidak lambat.

Peter
sumber

Jawaban:

27

Jawaban Kevin menjelaskan peristiwa apa yang harus diambil dalam SQL Trace / SQL Profiler. Untuk memperluas jawaban itu sedikit - SP:StmtCompletedakan menunjukkan kepada Anda setiap pernyataan dalam prosedur tersimpan diselesaikan, seperti yang terdengar.

Juga jika Anda berada pada sistem yang sibuk dan mencoba mendiagnosis masalah kinerja Anda harus berhati-hati dengan SQL Profiler. SQL Profiler jauh lebih lambat daripada menelusuri file atau menggunakan Extended Events. Posting blog ini oleh Jonathan Kehayias menunjukkan sekitar 90% overhead pada kinerja sistem dari menggunakan SQL Profiler dan sekitar 10% overhead dari penelusuran ke file. Lebih sedikit untuk Acara yang Diperpanjang. Itulah sebabnya biasanya disarankan untuk tidak menjalankan SQL Profiler sendiri

Meskipun informasi ini tersedia melalui Extended Events, saya akan menyarankan masih menggunakan SQL Trace (teknologi di belakang SQL Profiler) tetapi menelusuri ke file sebagai gantinya(jika Anda ingin berinvestasi dalam belajar dan menggunakan Extended Events ini akan menjadi cara untuk pergi, dalam versi masa depan SQL Server SQL Trace akan hilang dan semua yang kita miliki adalah Extended Events). Saya juga menyarankan Anda menyaring melalui tombol Filter Kolom keluar sebanyak mungkin kebisingan latar belakang untuk memastikan Anda hanya menangkap apa yang diperlukan. Anda dapat mengatur jejak Anda dengan alat Profiler menggunakan langkah-langkah yang dijelaskan Kevin dalam jawaban baiknya dan kemudian menambahkan filter dari GUI yang sama. Kemudian Anda dapat mengekspor jejak sebagai skrip dan menjalankan skrip itu di penelusuran SQL Server ke file di folder yang tidak berisi database atau file log transaksi. Untuk mengekspor, Anda cukup mengatur jejak Anda, menjalankannya selama beberapa detik untuk memastikan Anda menangkap apa yang Anda inginkan, menghentikannya dan kemudian pergi ke menu bar dan File->Export-> Script Trace Definitiondan simpan file tersebut. Lalu buka file itu di jendela kueri baru di server yang ingin Anda lacak. Anda dapat melihat lebih banyak tentang opsi dan definisi skrip ini yang Anda buat dengan melihat artikel bantuan untuk berbagai prosedur tersimpan yang digunakan dalam skrip yang baru saja Anda buat dengan memulai di sini .

Jika Anda punya waktu dan ingin belajar, Anda juga dapat membaca beberapa artikel tentang Peristiwa Diperpanjang dan melihat cara menangkap informasi juga. Jonathan Kehayias adalah sumber yang bagus untuk posting blog ketika Anda siap untuk memulai di sana.

Mike Walsh
sumber
2
Bagaimana ketika SP: StmtCompleted hanya menunjukkan "- Teks terenkripsi" dalam teks kueri? Bagaimana kita bisa mengetahui tabel mana yang sedang diakses?
Brain2000
Memiliki masalah yang sama dengan Anda @ Brain2000 ....
wenzzzel
21

Anda bisa menangkap pernyataan individu dalam prosedur tersimpan melalui SQL Server Profiler. Untuk melakukan ini, di tab Pilihan Acara Anda, klik kotak centang "Tampilkan semua acara". Kemudian, gulir ke bawah ke kategori Prosedur Tersimpan dan centang kotak di sebelah SP: StmtCompleted . Jika Anda juga memiliki SQL: BatchStarted dan SQL: BatchCompleted events dipilih, Anda bisa mendapatkan gambar awal-ke-akhir dari menjalankan prosedur tersimpan, mengikat semuanya bersama-sama oleh SPID.

Mungkin juga membantu untuk melihat cache rencana untuk melihat apakah Anda bisa mendapatkan rencana permintaan untuk prosedur yang berkinerja lambat. Anda bisa mulai dengan sesuatu seperti ini:

SELECT 
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM 
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';
Kevin Feasel
sumber