it-swarm-eu.dev

Jak najít příkazy SQL, které způsobily růst tempdb?

Tempdb serveru (SQL Server 2008) se každý měsíc zvyšuje na 500 GB + několikrát. Je možné zjistit, které příkazy SQL tento problém způsobily? Problém obvykle není způsoben programem create table #temp...; insert into #temp... nebo select ... into #temp... ale komplexní spojení.

Počáteční velikost některých souborů tempdb je také automaticky nastavena na mnohem větší hodnoty pokaždé. Jak tomu zabránit?

Plány v mezipaměti někdy zabraňují změně velikosti/zmenšení souborů. Jak zjistit, který z nich drží tempdb?

26
u23432534

Ke sledování využití tempdb můžete použít tři DMV:

První dva vám umožní sledovat přidělení na úrovni dotazu a relace. Třetí sleduje přidělení napříč úložišti verzí, uživateli a interními objekty.

Následující příklad dotazu vám poskytne příděly na relaci:

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

Pokud chcete sledovat využití po určitou dobu, zvažte sběr dat pomocí sp_whoisactive , jak ukazuje Kendra Little .

27

Problémy mohou mít různé zdroje:

  • použití proměnných tabulky nebo dočasných tabulek
  • sql server vytvořil přechodné sady výsledků jako pracovní tabulky v tempdb - obvykle pro účely řazení (obvykle je to známka chybějících indexů/zastaralé statistiky)
  • sql server se rozhodl předběžně vyhodnotit výsledky sady funkcí s hodnotou tabulky a v tomto případě ukládá data do tempdb
  • vytvoření indexů s volbou SORT_IN_TEMPDB = ON
4
Oleg Dok