Как найти операторы SQL, которые вызвали рост базы данных?

26

Tempdb сервера (SQL Server 2008) увеличивается до 500 ГБ + несколько раз в месяц. Можно ли узнать, какие операторы SQL вызвали эту проблему? Проблема, как правило, не вызвана create table #temp...; insert into #temp...или select ... into #temp...сложна.

Исходный размер некоторых TempDb файлов также автоматически устанавливается в гораздо больших значений каждый раз. Как это предотвратить?

Иногда кэшированные планы препятствуют изменению размеров / сжатию файлов. Как найти, кто из них держит tempdb?

u23432534
источник
1
К сожалению, уже почти 2 часа ночи, и я не могу ответить на этот вопрос полностью, однако эти URL-адреса могут пригодиться, пока вы ждете других ответов - mssqltips.com/sqlservertip/1432/… and google.com/search?q= какие + запросы + являются + использованием + tempdb
Аарон Бертран

Ответы:

27

Для отслеживания использования базы данных tempdb можно использовать три DMV:

Первые два позволят вам отслеживать распределение на уровне запросов и сеансов. Третий отслеживает распределение по хранилищу версий, пользовательским и внутренним объектам.

Следующий пример запроса даст вам распределение за сеанс:

SELECT
  sys.dm_exec_sessions.session_id AS [SESSION ID]
  ,DB_NAME(database_id) AS [DATABASE Name]
  ,HOST_NAME AS [System Name]
  ,program_name AS [Program Name]
  ,login_name AS [USER Name]
  ,status
  ,cpu_time AS [CPU TIME (in milisec)]
  ,total_scheduled_time AS [Total Scheduled TIME (in milisec)]
  ,total_elapsed_time AS    [Elapsed TIME (in milisec)]
  ,(memory_usage * 8)      AS [Memory USAGE (in KB)]
  ,(user_objects_alloc_page_count * 8) AS [SPACE Allocated FOR USER Objects (in KB)]
  ,(user_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR USER Objects (in KB)]
  ,(internal_objects_alloc_page_count * 8) AS [SPACE Allocated FOR Internal Objects (in KB)]
  ,(internal_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR Internal Objects (in KB)]
  ,CASE is_user_process
             WHEN 1      THEN 'user session'
             WHEN 0      THEN 'system session'
  END         AS [SESSION Type], row_count AS [ROW COUNT]
FROM 
  sys.dm_db_session_space_usage
INNER join
  sys.dm_exec_sessions
ON  sys.dm_db_session_space_usage.session_id = sys.dm_exec_sessions.session_id

Если вы хотите отслеживать использование в течение определенного периода времени, рассмотрите возможность сбора данных с помощью sp_whoisactive , как продемонстрировал Кендра Литтл .

Марк Стори-Смит
источник
3
Спасибо. Разница [SPACE Allocated FOR USER Objects (in KB)]и [SPACE Deallocated FOR USER Objects (in KB)]фактическая занимаемая площадь сеанса?
u23432534
4

Могут быть различные источники проблемы:

  • использование табличных переменных или временных таблиц
  • Сервер sql создал промежуточные наборы результатов как рабочие таблицы в базе данных tempdb - обычно для целей сортировки (обычно это признак отсутствия индексов / устаревшей статистики)
  • Сервер SQL решил предварительно оценить результирующий набор табличной функции и в этом случае он сохраняет данные в базе данных tempdb.
  • воссоздание индексов с опцией SORT_IN_TEMPDB = ON
Олег Док
источник