Як знайти оператори SQL, які викликали зростання tempdb?


26

Темпдб сервера (SQL Server 2008) збільшується до 500 ГБ + кілька разів щомісяця. Чи можна дізнатися, які оператори SQL викликали цю проблему? Проблема зазвичай не викликана create table #temp...; insert into #temp...або є select ... into #temp...складними приєднаннями.

Початковий розмір деяких TempDb файлів також автоматично встановлюється в набагато більших значень кожного разу. Як запобігти?

Іноді кешовані плани запобігають зміні розміру / зменшенню файлів. Як знайти, який утримує tempdb?


1
Вибачте, майже 2 години ранку, і я не маю потреби в повному відповіді на це питання, проте ці URL-адреси можуть стати в нагоді, поки ви будете чекати інших відповідей - mssqltips.com/sqlservertip/1432/… та google.com/search?q= які + запити + є + за допомогою + tempdb
Aaron Bertrand

Відповіді:


27

Існує три DMV, які можна використовувати для відстеження використання tempdb:

Перші два дозволить відстежувати розподіли на рівні запитів і сеансів. Третій відстежує розподіл у магазині версій, користувачеві та внутрішніх об'єктах.

Наступний приклад запиту дасть вам розподіл за сеанс:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.