So erstellen Sie ein Profil für gespeicherte Prozeduren


26

Ich verwende SQL Server 2012 und habe mich gefragt, wie ich gespeicherte Prozeduren profilieren soll

Kann der Profiler beispielsweise jede einzelne SQL-Anweisung in einer gespeicherten Prozedur erfassen, was es ist und wie lange es dauert, usw. ausgeführt zu werden?

Ich versuche, gespeicherte Prozeduren für die Zusammenführungsreplikation zu diagnostizieren, und diese müssen als Teil einer vollständigen Ausführung des Zusammenführungsagenten erfasst werden. Es scheint nicht möglich zu sein, die gespeicherte Prozedur mit Leistungsproblemen zu erfassen und erneut auszuführen, da sie zu diesem Zeitpunkt nicht langsam ist.

Antworten:


27

Kevins Antwort beschreibt, welche Ereignisse in SQL Trace / SQL Profiler erfasst werden sollen. Wenn Sie diese Antwort ein wenig erweitern, SP:StmtCompletedwird jede Anweisung innerhalb einer gespeicherten Prozedur so ausgeführt, wie es sich anhört.

Auch wenn Sie sich in einem ausgelasteten System befinden und versuchen, ein Leistungsproblem zu diagnostizieren, sollten Sie mit SQL Profiler vorsichtig sein. SQL Profiler ist viel langsamer als das Verfolgen einer Datei oder das Verwenden von erweiterten Ereignissen. Dieser Blog-Beitrag von Jonathan Kehayias zeigt einen Overhead von 90% für die Leistung eines Systems durch die Verwendung von SQL Profiler und einen Overhead von 10% von der Ablaufverfolgung bis zur Datei. Weniger für Extended Events. Aus diesem Grund wird in der Regel empfohlen, SQL Profiler nicht selbst auszuführen

Obwohl diese Informationen über Extended Events verfügbar sind, würde ich vorschlagen, weiterhin SQL Trace (die Technologie hinter SQL Profiler) zu verwenden, stattdessen jedoch eine Datei zu verfolgen(Wenn Sie in das Erlernen und Verwenden von erweiterten Ereignissen investieren möchten, ist dies der richtige Weg. In einer zukünftigen Version von SQL Server ist SQL Trace nicht mehr vorhanden, und wir haben nur erweiterte Ereignisse.) Ich würde auch vorschlagen, dass Sie über die Schaltfläche Spaltenfilter so viele Hintergrundgeräusche wie möglich herausfiltern, um sicherzustellen, dass Sie nur das Nötige erfassen. Sie können Ihre Ablaufverfolgung mit dem Profiler-Tool einrichten, indem Sie die Schritte ausführen, die Kevin in seiner guten Antwort beschreibt, und dann einen Filter über dieselbe GUI hinzufügen. Anschließend können Sie die Ablaufverfolgung als Skript exportieren und das Skript in der SQL Server-Ablaufverfolgung in einer Datei in einem Ordner ausführen, der keine Datenbank- oder Transaktionsprotokolldateien enthält. Zum Exportieren richten Sie einfach Ihre Ablaufverfolgung ein, führen sie einige Sekunden lang aus, um sicherzustellen, dass Sie erfassen, was Sie möchten, beenden Sie sie und gehen Sie dann zur Menüleiste und zu File->Export-> Script Trace Definitionund speichern Sie die Datei. Öffnen Sie dann diese Datei in einem neuen Abfragefenster auf dem Server, den Sie verfolgen möchten. Weitere Informationen zu den Optionen und Definitionen dieses Skripts finden Sie in den Hilfeartikeln zu den verschiedenen gespeicherten Prozeduren, die in dem soeben erstellten Skript verwendet wurden. Beginnen Sie hier .

Wenn Sie Zeit haben und lernen möchten, können Sie auch einige Artikel zu erweiterten Ereignissen lesen und erfahren, wie Sie die Informationen erfassen. Jonathan Kehayias ist eine großartige Ressource für Blog-Posts, wenn Sie bereit sind, dort zu beginnen.


2
Was ist, wenn in einem SP: StmtCompleted nur "- Verschlüsselter Text" im Abfragetext angezeigt wird? Wie können wir herausfinden, auf welche Tabellen zugegriffen wird?
Brain2000

Mit dem gleichen Problem wie Sie @ Brain2000 ....
Wenzzzel

21

Sie können die einzelnen Anweisungen in einer gespeicherten Prozedur über SQL Server Profiler erfassen. Aktivieren Sie dazu auf der Registerkarte Ereignisauswahl das Kontrollkästchen "Alle Ereignisse anzeigen". Scrollen Sie dann nach unten zur Kategorie Gespeicherte Prozeduren und aktivieren Sie das Kontrollkästchen neben SP: StmtCompleted . Wenn Sie auch die Ereignisse SQL: BatchStarted und SQL: BatchCompleted ausgewählt haben, können Sie sich von Anfang bis Ende ein Bild von einer gespeicherten Prozedur machen, indem Sie alle durch SPID zusammenfügen.

Es kann auch hilfreich sein, den Plan-Cache zu überprüfen, um festzustellen, ob Sie einen Abfrageplan für Ihre langsam ausgeführte Prozedur erhalten. Sie könnten mit so etwas beginnen:

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';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.