Я пытаюсь проанализировать мертвую блокировку в профилировщике SQL Server 2008 года. Я знаю, как найти незаконные запросы SQL, но собранные запросы не включают значения параметров.
Я другие слова I вижу что-то вроде этого:
DELETE FROM users WHERE id = @id
Но то, что я хотел бы видеть, является этим:
DELETE FROM users WHERE id = 12345
Я предполагаю, что существуют некоторые дополнительные события или Столбцы, которые я должен собрать в профилировщике, но я не знаю который. Я в настоящее время использую шаблон "TSQL_LOCKS".
Любые подсказки значительно ценились бы.
Спасибо,
Adrian
Отказ от ответственности: Я задал подобный вопрос прежде, но я предполагаю, что это было слишком конкретно, который является, почему я не получил ответов. Я запускаю другую попытку с этого.
Запустите трассировку со следующими событиями, при этом все флажки установлены:
SQL: BatchCompleted
SQL: BatchStarting
Deadlock graph
Lock:Deadlock
Lock:Deadlock chain
После возникновения взаимоблокировки остановите трассировку, затем щелкните класс событий графа взаимоблокировок.
Это должно дать вам хорошее представление о том, что идет не так.
Профилировщик будет содержать значения параметров в событиях RPC:Completed/RPC:Starting. Но вы уже получили ответы, говорящие об этом.
Хочу добавить, что для анализа тупикового графика очень мало нужно знать значения параметров во время выполнения. Во-первых, потому что если в дедлоке задействованы 'пользователи', то сам график дедлока выдаст, что @id является конфликтом, если конфликт находится на ключе. Во-вторых, что более важно, для сценария дедлока не имеет значения, какие именно клавиши в нем задействованы. Не похоже, что тупик случается потому, что удаляется пользователь с id 123, но не произойдет, когда он удалит пользователя 321.
Если вы решили спросить об SO в первую очередь, я думаю, что лучше всего было бы опубликовать реальный график дедлока и дать сообществу взглянуть на него. Здесь есть много таких, которые могут ответить на довольно много вопросов только с XML графа дедлока.
Если вы используете хранимую процедуру (которая выглядит так, как будто это вы) или спящий режим/NHibernate, вам может понадобиться включить событие запуска хранимой процедуры (SP:StmtStarting) и событие RPC:Starting. Это покажет параметры в собственной строке после запроса.
Что-то вроде:
SP:SP:StmtStarting DELETE FROM users WHERE id = @id
RPC:Starting exec sp_execute 12345
.