Eine Möglichkeit, die auszuführende gespeicherte Prozedur zu bestimmen, besteht in der Verwendung von "dynamischen Verwaltungsmethoden" wie folgt:
SELECT
sqlText.Text, req.*
FROM
sys.dm_exec_requests req
OUTER APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
Dies zeigt jedoch nur den Text der create-Anweisung der gespeicherten Prozedur an. z.B:
CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id
Im Idealfall würde ich gerne sehen, welche Parameter für die ausgeführte Prozedur dafür verantwortlich sind, dass sie für den jeweiligen Satz an fehlerhaften Parametern so lange ausgeführt wird.
Gibt es eine Möglichkeit, das zu tun? (In dieser Frage Aaron Bertrand erwähnt DBCC Inputbuffer , aber ich glaube nicht , dass für dieses Problem geeignet ist.)
sql-server
t-sql
sql-server-2005
stored-procedures
dmv
user420667
quelle
quelle
Antworten:
Diese Informationen - Laufzeitparameterwerte, die an eine gespeicherte Prozedur (dh einen RPC-Aufruf) oder eine parametrisierte Abfrage übergeben werden - sind nur über eine SQL-Ablaufverfolgung verfügbar (und ich nehme das entsprechende erweiterte Ereignis in den neueren Versionen von SQL Server an). Sie können dies sehen von SQL Server Profiler ausgeführt wird (es kommt mit SQL Server) und die verschiedenen „Completed“ Events auswählen, wie zum Beispiel:
RPC:Completed
,SP:Completed
, undSQL:BatchCompleted
. Sie müssen auch das Feld "TextData" auswählen, da sich die Werte dort befinden.Der Unterschied zwischen meiner Antwort und der Antwort von @ Kin auf diese Frage besteht darin, dass sich die Antwort von @ Kin darauf konzentriert, entweder
Meine Antwort konzentriert sich auf das Abrufen der Parameterwerte für andere Sitzungen, die derzeit ausgeführt werden. Wenn Sie sich auf die DMVs verlassen, können Sie nicht feststellen, ob der Laufzeitparameterwert mit dem kompilierten Parameterwert übereinstimmt. Im Kontext dieser Frage wird der Laufzeitwert von Abfragen ermittelt, die über andere Sitzungen / SPIDs gesendet werden (und in SQL Server 2005, während Extended Events in SQL Server 2008 eingeführt wurden).
quelle
Sie können den tatsächlichen Ausführungsplan aktivieren und dann das XML des Ausführungsplans anzeigen.
Oder Sie können verwenden SQL Sentry Plan Explorer - Tool und die sehen
parameters
Registerkarte , dass die Liste wirdcompiled value
undrun time value
für den tatsächlichen Ausführungsplan.Wenn Sie nicht können auf dem tatsächlichen Plan drehen , dann können Sie in Plan - Cache aussehen wie unten beschrieben.
quelle
Showplan XML Statistics Profile
Event in Profiler könnte auch verwendet werden , um den aktuellen Plan abzurufen. Wenn Sie Profiler jedoch entfernen, gibt es weniger intensive Möglichkeiten, dies zu erreichen.@SolomonRutzky ist richtig.
SQL Profiler Trace ist der einzige Weg ( ohne das Sproc zu bearbeiten) ).
Bearbeiten Sie Ihren Sproc:
Das nächstbeste ist jedoch, den betreffenden Sproc leicht zu bearbeiten.
Deklarieren Sie eine DateTime-Variable am Anfang mit der aktuellen Uhrzeit.
Protokollieren Sie am Ende des Sprocs die Werte für Sproc_StartTime, Sproc_EndTime und Parameter in einer Tabelle.
Sie können sogar eine Bedingungslogik hinzufügen, um ein DateDiff () nur für die Protokollierung zu verwenden, wenn bei der Verarbeitung des Sproc eine längere Zeit verwendet wurde.
Dies kann Ihren Sproc beschleunigen und den Platzverbrauch Ihrer Protokolltabelle verringern, wenn der Sproc "tip-top" ausgeführt wird.
Dann haben Sie eine Protokolldatei, die Sie über Monate abfragen und analysieren können (ohne dass ein Trace in Prod ausgeführt wird).
Wenn Sie mit der Optimierung Ihres Sproc fertig sind, löschen Sie einfach die wenigen Zeilen der Timer- und Logger-Logik, die Sie hinzugefügt haben.
Parameterwerte für den zwischengespeicherten Plan:
Ich sollte erwähnen, dass das Einbeziehen der Werte der aktuellen Cache-Plan-Parameter in Ihre Protokolltabelle Ihnen dabei helfen kann, festzustellen, ob sie das Leistungsproblem verschlimmern .
Ich verwende
OPTIMIZE FOR
diese Option, um festzulegen, wie Parameter in meinem Sproc behandelt werden sollen, wenn ich weiß, dass sie zum Schneiden und Zerteilen von Daten verwendet werden.Ich finde, dass die Verwendung von
OPTIMIZE FOR
Ergebnissen konsistent und schnell ist, wenn derselbe Sproc mit Parametern als optionale Filter verwendet wird .Es ist definitiv eine Variable weniger zu berücksichtigen, wenn Sie angeben, wie damit umgegangen werden soll.
Nachfolgend finden Sie ein Beispiel dafür, was Sie am Ende Ihrer Select-Anweisung hinzufügen könnten:
quelle
Bei der Verwendung der Abfrage von Erland Sommarskog zum Zerkleinern von Plan-XML und zum Herausziehen von ParameterCompiledValue ist mir aufgefallen, dass der erste CTE für "basedata" keine Pläne mit WARNUNGEN (z. B. implizite Konvertierungen) berücksichtigt, da der CHARINDEX (integrierte Funktion) nach der ersten Ausdrucksübereinstimmungszeichenfolge sucht Eingabe (dh) und solche Warnungen verwenden dieselben Phrasen / Knoten.
Ich schlage daher vor, diesen Abschnitt durch den überarbeiteten Abschnitt zu ersetzen:
Überarbeiteter Abschnitt:
quelle
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.
quelle