it-swarm-eu.dev

Tempdb se na serveru Microsoft SQL 2008 velmi rychle plní

snapshot of window and spaceVyvíjím nástroj pro analýzu protokolů a po dotazování a generování sestav Tempdb se velmi rychle plní.

Existuje nějaké řešení, jak vyčistit soubor tempdb na serveru Microsoft SQL Server 2008 na jiném základě než restartování serveru?

Děkuji moc předem

6
Rishi Ranka

Tempdb takto roste, protože to něco používá. Pokus o opravu, vyčištění nebo manipulaci s tempdbem nebude fungovat, dokud to bude pokračovat.

Chcete-li tento problém vyřešit, musíte zjistit, co způsobuje jeho růst takhle, a potom nejprve opravit problém that. To samo o sobě může vyřešit celý problém a odstranit vaši potřebu dělat něco jiného s tempdb. Podle mých zkušeností je nejpravděpodobnější příčinou něčeho podobného dotaz na křížové spojení mimo kontrolu (ačkoli existuje spousta dalších možností).

7
RBarryYoung

Nedávno jsme čelili stejnému problému. Mám tady úžasné řešení: Čištění tempdb
Určitě vám to pomůže. Vše nejlepší !!

0
Saurabh

Sdílením dotazu získáte velikost využití. Trochu jednodušší než dotaz MS kb.

use tempdb
go;

SELECT sum(unallocated_extent_page_count) [Free_Pages],
 (sum(unallocated_extent_page_count)*1.0/128) [Free_Space_MB]
FROM sys.dm_db_file_space_usage;
0
Brian Ott

vyvíjí nástroj pro analýzu protokolů a po dotazování a generování zpráv se Tempdb rychle plní.

V závislosti na tom, co váš nástroj dělá při generování sestav - vytváří spoustu tempdbových tabulek, při použití operátorů řazení atd. Rozplývá data do tempdb, doporučuji vám, abyste předvolili tempdb.

Je lepší optimalizovat SQL, který generuje sestavu. Může být uvedení správný index/y určitě pomůže.

Doporučujeme vždy dotazovat pouze data, která požadujete.

Začněte analýza statistik čekání .

Pomocí sp_whoisactive můžete analyzovat, co se děje na instanci vašeho serveru.

Níže uvedený dotaz vám pomůže identifikovat relace, které intenzivně používají tempdb:

/*
Lists the TempDB usage per each active session.
It helps identifying the sessions that use the tempdb heavily with internal objects.

When the internal objects usage is high, the session is probably using big hash tables or spooling in worktables. It could be a symptom of an inefficient plan or a missing index.

Shrinking a TempDB full of internal objects will probably have no effect, because the engine will not release the deallocated space. 

Ref: https://dba.stackexchange.com/a/19871/8783
*/


;WITH task_space_usage AS (
    -- SUM alloc/delloc pages
    SELECT session_id,
           request_id,
           SUM(internal_objects_alloc_page_count) AS alloc_pages,
           SUM(internal_objects_dealloc_page_count) AS dealloc_pages
    FROM sys.dm_db_task_space_usage WITH (NOLOCK)
    WHERE session_id <> @@SPID
    GROUP BY session_id, request_id
)
SELECT TSU.session_id,
       TSU.alloc_pages * 1.0 / 128 AS [internal object MB space],
       TSU.dealloc_pages * 1.0 / 128 AS [internal object dealloc MB space],
       EST.text,
       -- Extract statement from sql text
       ISNULL(
           NULLIF(
               SUBSTRING(
                   EST.text, 
                   ERQ.statement_start_offset / 2, 
                   CASE WHEN ERQ.statement_end_offset < ERQ.statement_start_offset THEN 0 ELSE( ERQ.statement_end_offset - ERQ.statement_start_offset ) / 2 END
               ), ''
           ), EST.text
       ) AS [statement text],
       EQP.query_plan
FROM task_space_usage AS TSU
--- Changed from inner join to left outer join to return rows for sessions that aren't currently actively running queries.
left outer join sys.dm_exec_requests ERQ WITH (NOLOCK)
    ON  TSU.session_id = ERQ.session_id
    AND TSU.request_id = ERQ.request_id
OUTER APPLY sys.dm_exec_sql_text(ERQ.sql_handle) AS EST
OUTER APPLY sys.dm_exec_query_plan(ERQ.plan_handle) AS EQP
WHERE EST.text IS NOT NULL OR EQP.query_plan IS NOT NULL
ORDER BY 3 DESC, 5 DESC

Existuje nějaké řešení, jak vyčistit soubor tempdb na serveru Microsoft SQL Server 2008 na jiném základě než restartování serveru?

Používejte jej opatrně na produkčním serveru !!

Je jedinou možnou alternativou k restartování služby

DBCC FREESYSTEMCACHE('ALL')--, která vymaže všechny objekty v mezipaměti, včetně nejen interních objektů, ale také plánů dotazů v mezipaměti.

DBCC FREESYSTEMCACHE ('tempdb') - vymaže mezipaměť pro tempdb

DBCC FREESYSTEMCACHE ('Temporary Tables & Table Variables') - vymaže všechny dočasné tabulky a proměnné

Viz také Rozdíl mezi FreeProcCache a FreeSystemCache

0
Kin Shah