Как получить значения параметров для запроса SQL Server в SQL Server Profiler - PullRequest
18 голосов
/ 23 декабря 2009

Я пытаюсь проанализировать тупик в профилировщике SQL Server 2008. Я знаю, как найти нарушающие SQL-запросы, но собранные запросы не включают значения параметров.

Другими словами, я вижу что-то вроде этого:

DELETE FROM users WHERE id = @id

Но то, что я хотел бы видеть, это:

DELETE FROM users WHERE id = 12345

Я предполагаю, что есть некоторые дополнительные события или столбцы, которые мне нужно собрать в профилировщике, но я не знаю, какие именно. В настоящее время я использую шаблон "TSQL_LOCKS".

Любые советы будут с благодарностью.

Спасибо

Адриан

Отказ от ответственности: я задавал подобный вопрос раньше, но я думаю, что он был слишком конкретным, поэтому я не получил ответов. Я начинаю еще одну попытку с этим.

Ответы [ 4 ]

19 голосов
/ 23 декабря 2009

Я думаю, вам нужен RPC: Завершенное событие:

http://msdn.microsoft.com/en-us/library/ms175543.aspx

4 голосов
/ 23 декабря 2009

Профилировщик будет содержать значения параметров в RPC: Завершено / RPC: Запуск событий. Но вы уже получили ответы, сообщающие вам это.

Что я хочу добавить, так это то, что для анализа графа тупиков очень мало необходимости знать значения времени выполнения параметра. Во-первых, потому что, если в взаимоблокировке участвуют «пользователи», сам график взаимных блокировок выдаст значение @id, если это конфликт по ключу. Во-вторых, что более важно, для тупикового сценария не имеет значения, какие именно ключи задействованы. Это не похоже на взаимоблокировку, потому что каждый удаляет пользователя с идентификатором 123, но не происходит, когда он удаляет пользователя 321.

Если вы решили сначала обратиться к SO, я думаю, что лучше всего было бы опубликовать фактический график тупиков и позволить сообществу взглянуть на него. Здесь есть много людей, которые могут ответить на довольно много вопросов только из тупикового графа XML.

1 голос
/ 23 декабря 2009

Если вы используете хранимую процедуру (которая выглядит так, как вы) или Hibernate / NHibernate, вам может потребоваться включить стартовое событие хранимых процедур (SP: StmtStarting) и RPC: стартовое событие. Это покажет параметры в отдельной строке после запроса.

Что-то вроде:

SP: StmtStarting УДАЛИТЬ ИЗ пользователей, ГДЕ id = @ id

RPC: запуск exec sp_execute 12345

1 голос
/ 23 декабря 2009

Запустите трассировку со следующими событиями, отметив все флажки:

SQL: BatchCompleted
SQL: BatchStarting
Deadlock graph
Lock:Deadlock
Lock:Deadlock chain

После возникновения тупика остановите трассировку, затем щелкните класс событий графа тупика.

Это должно дать вам хорошее представление о том, что происходит не так.

...