Salah satu cara untuk menentukan mengeksekusi prosedur tersimpan adalah dengan menggunakan metode "manajemen dinamis", seperti:
SELECT
sqlText.Text, req.*
FROM
sys.dm_exec_requests req
OUTER APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
Namun, ini hanya menampilkan teks dari pernyataan membuat prosedur tersimpan. misalnya:
CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id
Idealnya saya ingin melihat parameter apa yang digunakan untuk menjalankan prosedur yang menyebabkannya berjalan sangat lama untuk set parameter tertentu yang menyinggung.
Apakah ada cara untuk melakukan itu? (Dalam pertanyaan ini Aaron Bertrand menyebutkan DBCC InputBuffer , tapi saya pikir itu tidak sesuai untuk masalah ini.)
sql-server
t-sql
sql-server-2005
stored-procedures
dmv
pengguna420667
sumber
sumber
Jawaban:
Informasi ini - nilai parameter run-time diteruskan ke Stored Procedure (yaitu panggilan RPC) atau kueri parameterisasi - hanya tersedia melalui SQL Trace (dan saya mengasumsikan Extended Event yang setara dalam versi SQL Server yang lebih baru). Anda dapat melihat ini dengan menjalankan SQL Server Profiler (datang dengan SQL Server) dan memilih berbagai "Selesai" acara, seperti:
RPC:Completed
,SP:Completed
, danSQL:BatchCompleted
. Anda juga perlu memilih bidang "TextData" karena nilainya ada di sana.Perbedaan antara jawaban saya dan @ Kin jawaban atas pertanyaan ini adalah bahwa jawaban @ Kin (kecuali saya salah, dalam hal ini saya akan menghapus ini) berfokus pada mendapatkan baik:
Jawaban saya berfokus pada mendapatkan nilai parameter untuk sesi lain yang sedang berjalan. Ketika mengandalkan DMV, tidak ada cara untuk mengetahui apakah nilai parameter runtime sama dengan nilai parameter yang dikompilasi. Dan konteks pertanyaan ini adalah melacak nilai runtime kueri yang diajukan melalui Sesi / SPID lain (dan dalam SQL Server 2005, sedangkan Peristiwa Diperpanjang diperkenalkan dalam SQL Server 2008).
sumber
Anda dapat mengaktifkan paket eksekusi aktual dan kemudian melihat XML rencana eksekusi.
Atau Anda dapat menggunakan alat explorer plan sql sentry dan melihat
parameters
tab yang akan mencantumkancompiled value
danrun time value
untuk rencana eksekusi aktual.Jika Anda tidak dapat mengaktifkan paket yang sebenarnya maka Anda dapat melihat ke dalam cache rencana seperti yang dijelaskan di bawah ini.
sumber
Showplan XML Statistics Profile
event di Profiler untuk mendapatkan rencana yang sebenarnya meskipun jika mengeset Profiler akan ada cara yang kurang intensif untuk mendapatkan ini.@SolomonRutzky benar.
SQL Profiler Trace adalah satu-satunya cara ( tanpa mengedit Sproc ).
Edit Sproc Anda:
Namun , hal terbaik berikutnya adalah sedikit mengedit Sproc yang dimaksud.
Nyatakan variabel DateTime di awal dengan Waktu Saat Ini.
Di Akhir Sproc, Log Nilai Sproc_StartTime, Sproc_EndTime, dan Parameter ke Tabel.
Anda bahkan dapat menambahkan beberapa logika kondisional untuk menggunakan DateDiff () hanya untuk mencatat ketika waktu yang lama digunakan dalam memproses Sproc.
Ini dapat Mempercepat Sproc Anda dan mengurangi Konsumsi Ruang dari Tabel Log Anda ketika Sproc menjalankan tip-top.
Kemudian Anda memiliki File Log yang dapat Anda query dan analisis selama berbulan-bulan (tanpa Trace berjalan di Prod).
Ketika Anda selesai menyetel Sproc Anda, hapus saja beberapa baris Timer dan Logger logic yang Anda tambahkan.
Nilai Parameter Rencana-Cached:
Saya harus menyebutkan bahwa memasukkan Nilai Parameter Cached-Plan Saat Ini di Tabel Log Anda dapat membantu Anda menentukan apakah mereka menambah masalah kinerja .
Saya menggunakan
OPTIMIZE FOR
untuk mengatur bagaimana menangani Parameter di Sproc saya ketika saya tahu itu akan digunakan untuk mengiris dan mencelupkan data.Saya menemukan bahwa menggunakan
OPTIMIZE FOR
hasil yang konsisten dan cepat saat menggunakan Sproc yang sama dengan Parameter sebagai Filter Opsional .Ini jelas salah satu variabel yang kurang dipertimbangkan jika Anda menentukan cara menanganinya.
Di bawah ini adalah contoh dari apa yang Anda tambahkan ke bagian bawah Pernyataan-Pilih Anda:
sumber
Saya perhatikan ketika menggunakan permintaan Erland Sommarskog untuk merobek XML rencana dan mengeluarkan ParameterCompiledValue bahwa CTE "baseata" pertama tidak memperhitungkan rencana yang memiliki PERINGATAN (mis. Konversi implisit) sebagai CHARINDEX (fungsi ) mencari string pencocokan ekspresi pertama input (yaitu) dan peringatan tersebut menggunakan frase / node yang sama.
Karena itu saya mengusulkan mengganti bagian ini dengan bagian yang direvisi di bawah ini:
Bagian yang direvisi:
sumber
Disallowed implicit conversion from data type xml to data type varchar, table 'sys.dm_exec_query_plan', column 'query_plan'. Use the CONVERT function to run this query.
sumber