Одним из способов определения выполнения хранимой процедуры является использование методов «динамического управления», например:
SELECT
sqlText.Text, req.*
FROM
sys.dm_exec_requests req
OUTER APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
Однако при этом отображается только текст оператора create хранимой процедуры. например:
CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id
В идеале я хотел бы посмотреть, какие параметры были для запущенной процедуры, которые заставляют ее работать так долго для определенного набора ошибочных параметров.
Есть способ сделать это? (В этом вопросе Аарон Бертран упоминает DBCC InputBuffer , но я не думаю, что это подходит для этой проблемы.)
sql-server
t-sql
sql-server-2005
stored-procedures
dmv
user420667
источник
источник
Ответы:
Эта информация - значения параметров времени выполнения, передаваемые в хранимую процедуру (т. Е. Вызов RPC) или параметризованный запрос - доступна только через трассировку SQL (и я предполагаю эквивалентное расширенное событие в более новых версиях SQL Server). Вы можете увидеть это, запустив SQL Server Profiler (поставляется с SQL Server) и выбора различных «Completed» события, такие как:
RPC:Completed
,SP:Completed
, иSQL:BatchCompleted
. Вам также нужно выбрать поле «TextData», так как значения будут там.Разница между моим ответом и @ Kin в ответ на этот вопрос заключается в том , что @ ответ Kin в (если я не ошибаюсь, в этом случае я удалю это) фокусируется на том , как:
Мой ответ посвящен получению значений параметров для других сеансов, которые в данный момент выполняются. Опираясь на DMV, невозможно узнать, совпадает ли значение параметра среды выполнения со значением скомпилированного параметра. И контекст этого вопроса отслеживает значение времени выполнения запросов, отправляемых через другие Sessions / SPID (и в SQL Server 2005, тогда как расширенные события были введены в SQL Server 2008).
источник
Вы можете включить фактический план выполнения, а затем посмотреть на XML плана выполнения.
Или вы можете использовать инструмент плана исследователь SQL часового и увидеть
parameters
вкладку, перечислятcompiled value
иrun time value
для фактического выполнения плана.Если вы не можете включить фактический план, вы можете просмотреть кэш плана, как описано ниже.
источник
Showplan XML Statistics Profile
событие в Profiler, чтобы получить реальный план, хотя, если бы приложение Profiler не использовалось, были бы менее интенсивные способы его получения.@SolomonRutzky прав.
SQL Profiler Trace является единственным способом ( без редактирования Sproc ).
Редактировать свой Sproc:
Однако следующая лучшая вещь - это немного отредактировать рассматриваемый Sproc.
Объявите переменную DateTime в начале текущего времени.
В конце Sproc запишите значения Sproc_StartTime, Sproc_EndTime и Parameter в таблицу.
Вы могли бы даже добавить некоторую условную логику, чтобы использовать DateDiff () только для регистрации, когда при обработке Sproc использовалось расширенное количество времени.
Это может ускорить работу вашего Sproc и уменьшить потребление пространства в вашем журнальном столе, когда Sproc работает наверху.
Затем у вас есть файл журнала, который вы можете запрашивать и анализировать в течение нескольких месяцев (без трассировки в Prod).
Когда вы закончите настройку Sproc, просто удалите несколько строк логики Timer и Logger, которые вы добавили.
Значения параметров кэшированного плана:
Следует отметить, что включение значений параметров текущего кэшированного плана в таблицу журналов может помочь вам определить, не усугубляют ли они проблему производительности .
Я использую,
OPTIMIZE FOR
чтобы установить, как обрабатывать параметры в моем Sproc, когда я знаю, что он будет использоваться для разрезания и нарезания данных.Я считаю, что использование
OPTIMIZE FOR
дает последовательные и быстрые результаты при использовании того же Sproc с параметрами, что и дополнительные фильтры .Это определенно меньше переменной, чтобы рассмотреть, если вы укажите, как обрабатывать их.
Ниже приведен пример того, что вы можете добавить в нижней части вашего оператора выбора:
источник
Я заметил, что при использовании запроса Erland Sommarskog для уничтожения XML-плана и извлечения ParameterCompiledValue первый CTE «basedata» не учитывает планы, которые имеют WARNINGS (например, неявные преобразования), поскольку CHARINDEX (встроенная функция) ищет строку, соответствующую первому выражению вход (то есть) и такие предупреждения используют те же фразы / узлы.
Поэтому я предлагаю заменить этот раздел пересмотренным разделом ниже:
Пересмотренный раздел:
источник
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.
источник