У нас есть база данных SQL Server 2005, временная база данных заполнена. Зайдя в SQL Server Management Studio, я вижу все временные таблицы в базе данных tempdb. Можно ли сказать, какая сессия содержит какую временную таблицу? В идеале это запрос, в котором перечислены временные таблицы, используемые каждой сессией.
Спасибо,
sql-server
sql-server-2005
tempdb
SQLMIKE
источник
источник
Ответы:
Я попросил что-то встроить еще в 2007 году на Connect. Это было отклонено для выпуска 2008 года и впоследствии игнорировалось, пока Connect не умер несколько лет назад. Я пытался найти его на новом сайте обратной связи для SQL Server , но этот поиск - абсолютный пожар. Заголовок моего запроса был «dmv для сопоставления временной таблицы с session_id» - поскольку поиск может выполнять только ИЛИ, «сопоставить временную таблицу» возвращает 118 страниц результатов. Похоже, Google предлагает, чтобы этот предмет не попал, когда они убили Connect .
Между тем, для SQL Server 2005 и 2008 вы должны быть в состоянии извлечь эту информацию из трассировки по умолчанию:
Бесстыдно взято из этого поста в блоге Джонатана Кехайяса .
Чтобы определить использование пространства, вы можете дополнительно улучшить это, чтобы объединить данные из представлений, таких как
sys.db_db_partition_stats
- например:Проблема здесь заключается в попытке сопоставить имя таблицы по тексту запроса; это просто не практично, поскольку в большинстве случаев пользователь по- прежнему не выполняет запрос к этой таблице (не говоря уже о том, чтобы запустить тот, который его создал / заполнил).
Однако, и это для других читателей (или для вас при обновлении), трассировка по умолчанию в 2012+ больше не отслеживает создание объекта временной таблицы , если таблица #temp является кучей. Не уверен, является ли это совпадением или напрямую связано с тем, что начиная с 2012 года все временные таблицы теперь имеют отрицательные значения
object_id
. Конечно, вы можете перейти к Расширенным событиям, чтобы помочь вам собирать и отслеживать эту информацию, но это, возможно, большая ручная работа (и я только убедился, что она больше не отслеживается - вы, возможно, не сможете ее выбрать). в расширенных событиях тоже). Трассировка по умолчанию будет выбрать таблицы #temp, созданные с PK или другим ограничением, или с ограничениями или индексами, добавленными после события создания, но тогда вам придется ослабить ограничения, основанные на времени, указанные выше (индекс можно создать намного позже, чем через 100 мс после создание).Некоторые другие ответы на этом сайте, которые могут быть полезны:
Как определить, какой запрос заполняет журнал транзакций tempdb?
Проблемы с файлом mDD TempDB постоянно увеличиваются
Найти транзакции, которые заполняют магазин версий
Я также написал в блоге об этом с помощью специального сеанса расширенных событий для отслеживания этой информации в SQL Server 2012 и более поздних версиях:
А Пол Уайт написал в блоге о чтении страниц напрямую (не для слабонервных и не может быть легко автоматизировано):
источник
Вот запрос, который поможет вам начать поиск информации, которую вы ищете:
Этот запрос извлекает полезную информацию для топ-10 задач, таких как выделенные / освобожденные страницы, текст задач SQL (если имеется) и т. Д.
Эти DMV полны полезной информации, поэтому, если вам требуется больше данных, вы можете смешивать и сопоставлять то, что вы тянете. Но это должно стать отправной точкой для устранения неполадок текущих задач потребления базы данных tempdb.
источник
tempdb.sys.dm_db_partition_stats
. К сожалению, вы не можете точно сказать, какая копия#some_table_name
принадлежит какому пользователю, и вы не всегда сможете получить текст инструкции, который ссылается на эту таблицу в любой момент времени - это может быть не тот запрос, который в данный момент выполняет пользователь. Вы могли бы хотеть видеть это и это