Jednym ze sposobów określenia wykonanej procedury składowanej jest użycie metod „dynamicznego zarządzania”, takich jak:
SELECT
sqlText.Text, req.*
FROM
sys.dm_exec_requests req
OUTER APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
Jednak wyświetla to tylko tekst instrukcji create procedury składowanej. na przykład:
CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id
Idealnie chciałbym zobaczyć, jakie parametry były dla uruchomionej procedury, które powodują, że trwa ona tak długo dla określonego zestawu parametrów naruszających.
Czy jest na to sposób? (W tym pytaniu Aaron Bertrand wspomina DBCC InputBuffer , ale nie sądzę, żeby to było odpowiednie dla tego problemu).
sql-server
t-sql
sql-server-2005
stored-procedures
dmv
użytkownik420667
źródło
źródło
Odpowiedzi:
Informacje te - wartości parametrów w czasie wykonywania przekazywane do procedury składowanej (tj. Wywołanie RPC) lub sparametryzowane zapytanie - są dostępne tylko za pośrednictwem śledzenia SQL (i zakładam, że równoważne zdarzenie rozszerzone w nowszych wersjach programu SQL Server). Można to zobaczyć uruchamiając SQL Server Profiler (chodzi o SQL Server) i wybierając różne „Completed” wydarzeń, takich jak:
RPC:Completed
,SP:Completed
, iSQL:BatchCompleted
. Musisz także wybrać pole „TextData”, ponieważ będą tam wartości.Różnica między moją odpowiedź i @ Kin za odpowiedź na to pytanie jest to, że @ Kin za odpowiedź (o ile się nie mylę, w którym to przypadku usunę ten) skupia się na coraz albo:
Moja odpowiedź koncentruje się na uzyskaniu wartości parametrów dla innych aktualnie uruchomionych sesji. Korzystając z DMV, nie ma możliwości sprawdzenia, czy wartość parametru środowiska wykonawczego jest taka sama, jak wartość parametru skompilowanego. A kontekstem tego pytania jest śledzenie wartości środowiska wykonawczego zapytań przesyłanych za pośrednictwem innych sesji / identyfikatorów SPID (oraz w SQL Server 2005, podczas gdy w SQL Server 2008 wprowadzono zdarzenia rozszerzone).
źródło
Państwo może włączyć rzeczywistego planu wykonania, a następnie spojrzeć na XML plan wykonania.
Można też użyć planu explorer narzędzie SQL wartownika i zobaczyć
parameters
zakładkę, która będzie notowaćcompiled value
irun time value
dla rzeczywistego planu wykonania.Jeśli nie możesz włączyć aktualnego planu, możesz przejrzeć pamięć podręczną planu, jak opisano poniżej.
źródło
Showplan XML Statistics Profile
zdarzenie w programie Profiler, aby uzyskać aktualny plan, jednak jeśli wyrzucenie programu Profiler byłoby mniej intensywne.@SolomonRutzky ma rację.
SQL Profiler Trace to jedyny sposób ( bez edycji Sproc ).
Edytuj swój proces:
Jednak kolejną najlepszą rzeczą jest nieznaczna edycja danego Sproc.
Zadeklaruj zmienną DateTime na początku bieżącym czasem.
Na końcu Sproc, zarejestruj Sproc_StartTime, Sproc_EndTime i wartości parametrów w tabeli.
Możesz nawet dodać pewną logikę warunkową, aby użyć funkcji DateDiff () do rejestrowania tylko wtedy, gdy dłuższy czas był używany do przetwarzania Sproc.
Może to przyspieszyć twój Sproc i zmniejszyć zużycie miejsca przez twoją tabelę logów, gdy Sproc jest na szczycie.
Następnie masz plik dziennika, który możesz przeszukiwać i analizować przez miesiące (bez śledzenia uruchomionego w Prod).
Po zakończeniu dostrajania Sproc, po prostu usuń kilka dodanych linii logiki Timer i Logger.
Wartości parametrów planu buforowanego:
Powinienem wspomnieć, że uwzględnienie bieżących wartości parametrów planu buforowanego w tabeli dziennika może pomóc w ustaleniu, czy zwiększają one problem z wydajnością .
Używam,
OPTIMIZE FOR
aby ustawić sposób obsługi parametrów w moim Sproc, gdy wiem, że będzie on używany do krojenia i krojenia danych.Uważam, że użycie
OPTIMIZE FOR
daje spójne i szybkie wyniki przy użyciu tego samego Sproc z parametrami jak filtry opcjonalne .To zdecydowanie jedna zmienna mniejsza do rozważenia, jeśli określisz, jak sobie z nimi poradzić.
Poniżej znajduje się przykład tego, co możesz dodać na dole swojej instrukcji Select:
źródło
Zauważyłem, używając zapytania Erlanda Sommarskoga do zniszczenia planu XML i wyciągnięcia parametru ParameterCompiledValue, że pierwsze CTE „oparte na danych” nie uwzględniają planów zawierających OSTRZEŻENIA (np. Niejawne konwersje), ponieważ CHARINDEX (funkcja wbudowana) szuka pierwszego ciągu dopasowującego wyrażenie dane wejściowe (tj.) i takie ostrzeżenia używają tych samych wyrażeń / węzłów.
Proponuję zatem zastąpić tę sekcję poprawioną sekcją poniżej:
Zmieniona sekcja:
źródło
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.
źródło