Я хотел бы знать, как определить точный запрос или сохраненный процесс, который фактически заполняет журнал транзакций базы данных TEMPDB.
65
Я хотел бы знать, как определить точный запрос или сохраненный процесс, который фактически заполняет журнал транзакций базы данных TEMPDB.
Ответы:
С http://www.sqlservercentral.com/scripts/tempdb/72007/
РЕДАКТИРОВАТЬ
Как отметил Мартин в комментарии, он не найдет активные транзакции , которые занимают место в базе данных tempdb, он найдет только активные запросы , которые в настоящее время используют место (и, вероятно, виновники для текущего использования журнала). Таким образом, может быть открытая транзакция, но фактический запрос, вызывающий проблему, больше не выполняется.
Вы можете изменить
inner join
onsys.dm_exec_requests
на aleft outer join
, тогда вы будете возвращать строки для сеансов, которые в данный момент не выполняют активно запросы.В запросе Мартина размещены ...
... идентифицирует
session_id
s с активными транзакциями, которые занимают пространство журнала, но вы не обязательно сможете определить фактический запрос, вызвавший проблему, поскольку, если он не выполняется сейчас, он не будет зафиксирован в приведенном выше запросе для активные запросы. Вы можете быть в состоянии реактивно проверить самый последний запрос, используя,DBCC INPUTBUFFER
но он может не сказать вам, что вы хотите услышать. Вы можете выполнить внешнее объединение аналогичным образом, чтобы захватить активно работающих пользователей, напримерВы также можете использовать DMV
sys.dm_db_session_space_usage
для просмотра общего использования пространства по сеансам (но, опять же, вы не сможете получить действительные результаты для запроса; если запрос неактивен, то, что вы получите, может не быть фактическим виновником).Имея все эти запросы в вашем распоряжении, вы сможете определить, кто использует tempdb и как, особенно если вы поймали их в действии.
несколько советов по минимизации использования базы данных tempdb
SORT_IN_TEMPDB
возможность, если она не нужнаВы также можете подумать, что использование журнала tempdb может быть вызвано внутренними процессами, которые вы практически не контролируете - например, почта базы данных, уведомления о событиях, уведомления о запросах и сервисный брокер каким-то образом используют tempdb. Вы можете прекратить использовать эти функции, но если вы используете их, вы не можете диктовать, как и когда они используют базу данных tempdb.
источник
session_id
обнаруживается со следующим запросомSELECT database_transaction_log_bytes_reserved,session_id FROM sys.dm_tran_database_transactions tdt JOIN sys.dm_tran_session_transactions tst ON tdt.transaction_id = tst.transaction_id WHERE database_id = 2
. Запрос я ожидал найти было после запуска следующейBEGIN TRAN CREATE TABLE #T(X CHAR(8000)) INSERT INTO #T SELECT name FROM sys.objects
@@SPID
Это<>
не=
.dm_db_task_space_usage
отчеты0
для спида с открытой транзакцией для всех столбцов для меня. Интересно, если вам нужно запросить его, когда запрос фактически выполняется, а не простаивает с открытой транзакцией.https://social.msdn.microsoft.com/Forums/sqlserver/en-US/17d9f862-b9ae-42de-ada0-4229f56712dc/tempdb-log-filling-cannot-find-how-or-what?forum=sqldatabaseengine
источник
Спасибо за этот пост, вероятно, единственный в своем роде. Мой тест был прост: создайте временную таблицу и убедитесь, что она появляется, когда я запускаю любой из запросов из этого поста ... только один или два действительно успешны. Я исправил его, чтобы присоединиться к T-SQL, оптимизировал его для более длительных запусков и сделал его довольно полезным. Дайте мне знать, если я что-то пропустил, но пока у вас есть автоматический / зацикленный скрипт. Он предоставляет способ оценить, какой запрос / SPID является нарушителем за определенный период времени, используя запрос стандартного отклонения (STDEV), приведенный ниже.
Это выполняется каждые 3 минуты в течение 40 раз, так что 2 часа. Измените параметры по своему усмотрению.
Ниже есть фильтр WHERE> 50 страниц, который люди могут захотеть очистить на случай, если у вас много небольших таблиц. В противном случае вы не поймете этот нюанс с ниже, как это ...
Наслаждайтесь!
источник
К сожалению, журнал tempDB нельзя напрямую отследить до идентификаторов сеансов, просматривая запущенные процессы.
Сожмите файл журнала tempDB до такой степени, что он снова значительно вырастет. Затем создайте расширенное событие, чтобы зафиксировать рост журнала. Когда он снова вырастет, вы можете развернуть расширенное событие и просмотреть файл событий пакета. Откройте файл, добавьте фильтр времени, фильтр типа файла (вам не нужны результаты файла данных), а затем сгруппируйте его по идентификатору сеанса в SSMS. Это поможет вам найти виновника (ей), так как вы ищете идентификаторы сессий с наибольшим количеством групп. Конечно, вам нужно собрать то, что выполняется в идентификаторах сессий через другой процесс или инструмент. Может быть, кто-то знает, как получить запрос из столбца query_hash, и будет достаточно любезен, чтобы опубликовать решение.
Расширенные результаты мероприятия:
Скрипт для создания расширенного события:
источник