Ich behebe Leistungsprobleme bei einer in SQL Server gespeicherten Prozedur mit mehreren Anweisungen. Ich möchte wissen, für welche Teile ich Zeit verbringen soll.
Ich verstehe aus Wie lese ich Abfragekosten und ist es immer ein Prozentsatz? dass , selbst wenn SSMS erzählt tatsächlichen Ausführungsplan enthalten , nach wie vor die „Abfragekosten (bezogen auf die Charge)“ Zahlen auf Kosten basiert Schätzungen , die aus Wirklichkeiten sein weit kann
Ich verstehe aus der Messung der Abfrageleistung: "Abfragekosten für Ausführungsplan" im Vergleich zu "Zeitaufwand", dass ich den Aufruf der gespeicherten Prozedur mit SET STATISTICS TIME
Anweisungen umgeben kann, und erhalte dann eine Liste wie diese im Bereich Messages
:
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.
mit einer Ausgangsnachricht für jede Anweisung.
Ich kann die Zeitstatistikausgabe 'einfach' (wenn auch nicht bequem) mit den Ausführungsplänen für Anweisungen für Anweisungen im Ausführungsplanbereich verknüpfen, indem ich sie zähle: Die vierte SQL Server Execution Times
Nachrichtenausgabe entspricht Query 4
im Ausführungsplanbereich usw.
Aber gibt es einen besseren Weg?
Duration
und dieCPU
Ergebnisse eher Istwerte als Schätzungen, ja?Ein guter Weg, dies zu tun, ist mit Profiler. Richten Sie einen "Repro" Ihres Problemprozesses auf einem Entwickler oder einer Testbox ein, dh einen Beispielaufruf an den Prozess mit Parametern. Erstellen Sie dann mit Profiler einen Trace mithilfe der Vorlage TSQL_SPs oder fügen Sie aus einer leeren Vorlage das Ereignis SP: StmtCompleted hinzu. Fügen Sie die Spalten Duration, Reads, Writes und CPU hinzu, falls diese noch nicht verfügbar sind. Fügen Sie dem Trace in Ihrer SPID einen Filter hinzu (den Sie aus Management Studio kennen sollten). Sie können der Dauer auch einen Filter hinzufügen (z. B. größer als 1000 = größer als 1 Sekunde).
Sie können den Trace entweder in Profiler ausführen, obwohl Overhead besteht (tun Sie dies NICHT in einer Produktionsbox) oder die Definition exportieren und einen serverseitigen Trace erstellen. Der Profiler-Overhead ist bei einem dedizierten Entwickler oder einer Testbox nicht so wichtig.
Führen Sie den Prozess aus und lassen Sie ihn abschließen. Sie können auch den tatsächlichen Ausführungsplan an dieser Stelle abholen.
Stoppen Sie Ihre Ablaufverfolgung und öffnen Sie die Datei. Sie sollten eine zeilenweise Aufschlüsselung Ihres Prozesses sehen, einschließlich der Zeitangaben für jeden Schritt. Ich finde dies nützlicher als den Plan zur Identifizierung von Engpässen, obwohl der Plan nützlich sein wird, wenn man sich die relevanten Abschnitte ansieht, um sie zu optimieren.
HTH
quelle
Sie können auch die dynamischen Verwaltungsansichten sys.dm_exec_procedure_stats und sys.dm_exec_query_stats verwenden . Die erste gibt Auskunft über das gesamte Verfahren; Die zweite kann verwendet werden, um jede Abfrage in der Prozedur aufzuteilen. Ein Beispiel ist unten gezeigt:
Verfahrensstatistik:
Abfragen innerhalb der Prozedur:
quelle