Styrning av tempdb-utrymmesresurser

Gäller för: SQL Server 2025 (17.x) och senare versioner

När du aktiverar tempdb styrning av utrymmesresurser förbättrar du tillförlitligheten och undviker avbrott genom att förhindra att skenande frågor eller arbetsbelastningar förbrukar stora mängder utrymme i tempdb.

Från och med SQL Server 2025 (17.x) kan du använda resursguvernören för att framtvinga en gräns för den totala mängden tempdb utrymme som förbrukas av en arbetsbelastningsgrupp. När en begäran (en fråga) försöker överskrida gränsen avbryter resursguvernören den med ett tydligt fel som anger att arbetsbelastningsgruppens gräns tillämpas.

I själva verket kan du partitionera den delade tempdb-utrymmet mellan olika arbetsbelastningar. Du kan till exempel ange en högre gräns för en arbetsbelastningsgrupp som används av ett verksamhetskritiskt program och ange en lägre gräns för den default arbetsbelastningsgrupp som används av alla andra arbetsbelastningar.

Stegvisa konfigurationsexempel finns i Självstudie: Exempel för att konfigurera tempdb-resursstyrning för utrymme.

Kom igång med resource governor

Resource Governor tillhandahåller ett flexibelt ramverk för att ange olika tempdb utrymmesgränser för olika program, användare, användargrupper osv. Du kan också ange gränser baserat på anpassad logik.

Om du är nybörjare på resursguvernören i SQL Server kan du läsa resursguvernören för att lära dig mer om dess begrepp och funktioner.

En genomgång och metodtips för konfiguration av resursguvernör finns i Självstudie: Konfigurationsexempel och metodtips för Resource Governor.

Ange gränser för tempdb-utrymmesförbrukning

Du kan begränsa tempdb utrymmesförbrukningen för en arbetsbelastningsgrupp på något av två sätt:

  • Ange en fast gräns med hjälp GROUP_MAX_TEMPDB_DATA_MB av argumentet .

    Använd den fasta gränsen när du känner till arbetsbelastningens tempdb användningskrav i förväg eller när tempdb storleken inte ändras.

  • Ange en procentgräns med hjälp GROUP_MAX_TEMPDB_DATA_PERCENT av argumentet .

    Använd procentgränsen när du kan ändra den maximala storleken över tid och du vill att utrymmet tempdb som är tillgängligt för varje arbetsbelastningsgrupp ska ändras proportionellt utan att ändra konfigurationen för tempdb arbetsbelastningsgrupper. Om du till exempel skalar upp en virtuell Azure-dator som kör SQL Server och ökar den maximala tempdb storleken ökar även det tempdb tillgängliga utrymmet för varje arbetsbelastningsgrupp med en procentgräns.

Mer information om argumenten GROUP_MAX_TEMPDB_DATA_MB och GROUP_MAX_TEMPDB_DATA_PERCENT finns i CREATE WORKLOAD GROUP eller ALTER WORKLOAD GROUP.

Om du anger både fasta gränser och procentgränser för samma arbetsbelastningsgrupp har den fasta gränsen företräde framför procentgränsen.

På en viss SQL Server-instans kan du ha en blandning av arbetsbelastningsgrupper med fasta gränser, procentgränser eller inga gränser för tempdb utrymmesförbrukning. Information om hur du visar effektiva gränser finns i exemplet Visa effektiva tempdb-utrymmesgränser per arbetsbelastningsgrupp .

Konfiguration av procentgräns

När du kör satsen ALTER RESOURCE GOVERNOR RECONFIGURE gäller procentgränser enligt följande tabell:

Konfiguration Beskrivning Maxstorlek för tempdb (100%) Procentgräns i praktiken
- GROUP_MAX_TEMPDB_DATA_MB är inte inställd
– För alla datafiler MAXSIZE är det inte UNLIMITED
– För samtliga datafiler är FILEGROWTH inte noll
tempdb datafiler kan växa upp automatiskt till sin maximala storlek Summan av MAXSIZE värden för alla datafiler Ja
- GROUP_MAX_TEMPDB_DATA_MB är inte inställt
– För alla datafiler är MAXSIZEUNLIMITED
– För alla datafiler FILEGROWTH är noll
tempdb datafiler är i förväg utökade till sin avsedda storlek och kan inte utökas ytterligare Summan av SIZE värden för alla datafiler Ja
Alla andra konfigurationer Nej

Information om hur du visar konfigurationen tempdb finns i konfigurationsexemplet Visa tempdb-datafil .

Tänk på följande när du använder procentgränser:

  • Om du anger GROUP_MAX_TEMPDB_DATA_PERCENT och kör RECONFIGURE-instruktionenALTER RESOURCE GOVERNOR, men datafilkonfigurationen inte uppfyller kraven, slutförs instruktionen och procentgränserna lagras, men de tillämpas inte. I det här fallet får du varningsmeddelandet 10989, allvarlighetsgrad 10, som också loggas i felloggen:

    GROUP_MAX_TEMPDB_DATA_PERCENT is not in effect because tempdb
    configuration requirements aren't met.
    
  • Om du vill att procentgränserna ska vara effektiva konfigurerar tempdb du om datafilerna så att de uppfyller kraven och kör ALTER RESOURCE GOVERNOR RECONFIGURE igen. Mer information om hur du konfigurerar SIZE, FILEGROWTHoch MAXSIZE, finns i ALTER DATABASE Fil- och filgruppsalternativ.

  • Om en procentgräns gäller och du lägger till, tar bort eller ändrar storlek på tempdb datafiler måste du köra ALTER RESOURCE GOVERNOR RECONFIGURE för att uppdatera resursguvernören med den nya maximala storleken tempdb (100%).

Anmärkning

För en ny SQL Server instans är MAXSIZE datafilen UNLIMITED och FILEGROWTH är större än noll, vilket innebär att procentgränserna inte är effektiva. Om du vill använda procentgränser måste du antingen:

  • Förväxa tempdb datafiler till deras avsedda storlekar och ställ in FILEGROWTH på noll.
  • MAXSIZE Ange ett begränsat värde för varje datafil.
  • För varje tempdb datafilvolym kontrollerar du att summan av MAXSIZE värdena för filer på volymen är mindre än eller lika med det tillgängliga diskutrymmet på volymen. Om en volym till exempel har 100 GB ledigt utrymme och har två tempdb datafiler gör MAXSIZE du varje fil till 50 GB eller mindre.

Så här fungerar det

I det här avsnittet beskrivs styrning av utrymmesresurser tempdb i detalj.

  • När datasidor i tempdb allokeras och frigörs, för resursguvernören register över det tempdb utrymme som förbrukas av varje arbetsbelastningsgrupp.

    Om resursguvernören är aktiverad och en tempdb utrymmesförbrukningsgräns har angetts för en arbetsbelastningsgrupp, och en begäran (en fråga) som körs i arbetsbelastningsgruppen försöker få den totala tempdb utrymmesförbrukningen av gruppen över gränsen, avbryts begäran med fel 1138, allvarlighetsgrad 17:

    Could not allocate a new page for database 'tempdb' because that
    would exceed the limit set for workload group 'workload-group-name'".
    

    När en begäran avbryts med fel 1138 ökas värdet i kolumnen i total_tempdb_data_limit_violation_countsys.dm_resource_governor_workload_groups dynamiska hanteringsvyn (DMV) med en och den tempdb_data_workload_group_limit_reached utökade händelsen utlöses.

  • Resursguvernören håller reda på all tempdb användning som kan hänföras till en arbetsbelastningsgrupp, inklusive tillfälliga tabeller, variabler (inklusive tabellvariabler), tabellvärdesparametrar, icke-temporära tabeller, markörer och tempdb användning under frågebearbetning, till exempel spooler, spill, arbetstabeller och arbetsfiler.

    Utrymmesförbrukning för globala temporära tabeller och icke-temporära tabeller i tempdb redovisas under den arbetsbelastningsgrupp som infogar den första raden i tabellen, även om sessioner i andra arbetsbelastningsgrupper lägger till, ändrar eller tar bort rader i samma tabell.

  • De konfigurerade förbrukningsgränserna tempdb för varje arbetsbelastningsgrupp visas i sys.resource_governor_workload_groups katalogvyn i kolumnerna group_max_tempdb_data_mb och group_max_tempdb_data_percent .

    Den aktuella förbrukningen och den högsta förbrukningen av tempdb utrymme av en arbetsbelastningsgrupp exponeras i sys.dm_resource_governor_workload_groups DMV, i respektive kolumner tempdb_data_space_kb och peak_tempdb_data_space_kb.

    Tips/Råd

    tempdb_data_space_kb och peak_tempdb_data_space_kb kolumner i sys.dm_resource_governor_workload_groups bibehålls även om inga gränser för tempdb utrymmesförbrukning har angetts.

    Du kan skapa klassificerarfunktionen och arbetsbelastningsgrupperna utan att först ange några gränser. Övervaka tempdb användningen per grupp över tid för att upprätta representativa användningsmönster och ange sedan gränser efter behov.

  • tempdb användning av versionsarkiven, inklusive det beständiga versionsarkivet (PVS) när accelererad databasåterställning (ADR) är aktiverad i tempdb, styrs inte eftersom radversioner kan användas av begäranden i flera arbetsbelastningsgrupper.

  • Utrymmesförbrukning i tempdb redovisas som antalet 8 KB-datasidor som används. Även om en sida inte är helt fylld med data lägger den till 8 KB till arbetsbelastningsgruppens förbrukning.

  • tempdb lagringsutrymmesredovisning underhålls under en arbetsgrupps livslängd. Om en arbetsbelastningsgrupp tas bort medan globala temporära tabeller eller icke-temporära tabeller med data som redovisas för den här arbetsbelastningsgruppen finns kvar i tempdb, så redovisas inte det utrymme som används av dessa tabeller under någon annan arbetsbelastningsgrupp.

  • tempdb styrning av utrymmesresurser styr utrymmet i tempdb datafiler, men inte diskutrymmet på de underliggande volymerna. Om du inte utökar tempdb datafilerna i förväg till deras avsedda storlekar kan utrymmet på de volymer där tempdb de finns förbrukas av andra filer. Om det inte finns något återstående utrymme för tempdb datafiler att växa, kan det tempdb ta slut på utrymme innan någon arbetsbelastningsgruppsgräns för tempdb utrymmesförbrukning nås.

  • Utrymmesresursstyrning i tempdb gäller för datafiler men inte transaktionsloggfilen. Aktivera tempdb i för att säkerställa att transaktionsloggen inte förbrukar mycket utrymme.tempdb

Skillnader med utrymmesspårning på sessionsnivå

Sys.dm_db_session_space_usage DMV tillhandahåller tempdb utrymmesallokering och frigöringsstatistik för varje session. Även om det bara finns en session i en arbetsbelastningsgrupp kanske statistik för utrymmesanvändning från den här DMV:en inte matchar exakt statistiken från vyn sys.dm_resource_governor_workload_groups av följande skäl:

  • Till skillnad från sys.dm_resource_governor_workload_groups, sys.dm_db_session_space_usage:
    • Återspeglar tempdb inte utrymmesanvändningen för de uppgifter som körs just nu. Statistik i sys.dm_db_session_space_usage uppdateras när en uppgift har slutförts. Statistik i sys.dm_resource_governor_workload_groups uppdateras kontinuerligt.
    • IAM-sidor (indexallokeringskarta) spåras inte. Mer information finns i guide för sid- och omfattningsarkitektur.
  • När rader har tagits bort, eller när en tabell, ett index eller en partition tas bort eller trunkeras, frigör databasmotorn datasidorna. Frigöringen kan ske synkront eller utföras av en asynkron bakgrundsprocess. sys.dm_resource_governor_workload_groups visar dessa sidfördelningar när de sker, även om sessionen som orsakade dessa frilokaliseringar stängdes och inte längre finns i sys.dm_db_session_space_usage.

Metodtips för styrning av tempdb-utrymmesresurser

Innan du konfigurerar tempdb utrymmesresursstyrning bör du överväga följande metodtips:

  • Granska de allmänna metodtipsen för resursguvernören.

  • I de flesta scenarier bör du undvika att ange tempdb utrymmesförbrukningsgränsen till ett litet värde eller noll, särskilt för default arbetsbelastningsgruppen. Om du anger den här gränsen till ett litet värde eller noll kan många vanliga uppgifter börja misslyckas om de behöver allokera utrymme i tempdb. Om du till exempel anger antingen den fasta gränsen eller procentgränsen till 0 för default arbetsbelastningsgruppen kanske du inte kan öppna Object Explorer i SQL Server Management Studio (SSMS).

  • Om du inte skapar anpassade arbetsbelastningsgrupper och en klassificerarfunktion som placerar arbetsbelastningar i sina dedikerade grupper bör du undvika att tempdb begränsa användningen av default arbetsbelastningsgruppen. Om du begränsar tempdb utrymmesförbrukningen för default arbetsbelastningsgruppen kan frågor returnera fel 1138. Det här felet uppstår när tempdb det fortfarande finns oanvänt utrymme som inte kan användas av någon användararbetsbelastning.

  • Summan av GROUP_MAX_TEMPDB_DATA_MB värden för alla arbetsbelastningsgrupper kan överskrida den maximala tempdb storleken. Om den maximala tempdb storleken till exempel är 100 GB GROUP_MAX_TEMPDB_DATA_MB kan gränserna för arbetsbelastningsgrupp A och arbetsbelastningsgrupp B vara 80 GB vardera.

    Den här metoden förhindrar fortfarande att varje arbetsbelastningsgrupp förbrukar allt utrymme i tempdb genom att lämna 20 GB för andra arbetsbelastningsgrupper. Samtidigt undviker du onödiga fråge aborter när ledigt tempdb utrymme fortfarande är tillgängligt eftersom arbetsbelastningsgrupperna A och B sannolikt inte förbrukar mycket tempdb utrymme samtidigt.

    På samma sätt kan summan av GROUP_MAX_TEMPDB_DATA_PERCENT värdena för alla arbetsbelastningsgrupper överstiga 100 procent. Du kan allokera mer tempdb utrymme till varje grupp om du vet att flera grupper sannolikt inte kommer att orsaka hög tempdb användning samtidigt.

Examples

Visa konfiguration av tempdb-datafil

Följande fråga visar den aktuella tempdb datafilkonfigurationen:

SELECT file_id,
       name,
       size * 8. / 1024 AS size_mb,
       IIF (max_size = -1, NULL, max_size * 8. / 1024) AS maxsize_mb,
       IIF (is_percent_growth = 0, growth * 8. / 1024, NULL) AS filegrowth_mb,
       IIF (is_percent_growth = 1, growth, NULL) AS filegrowth_percent
FROM sys.master_files
WHERE database_id = 2
      AND type_desc = 'ROWS';

För en viss fil i resultatuppsättningen:

  • Om kolumnen maxsize_mb är NULL, då är MAXSIZEUNLIMITED.
  • När antingen filegrowth_mb eller filegrowth_percent är noll är det FILEGROWTH noll.

Visa effektiva tempdb-utrymmesgränser per arbetsbelastningsgrupp

Följande fråga visar den effektiva tempdb utrymmesförbrukningsgränsen för varje arbetsbelastningsgrupp. Gränsen returneras i megabyte för konfiguration av antingen fast gräns eller procentgräns .

Om kolumnen group_effective_limit_mb är NULLbetyder det något av följande:

  • Varken fast eller procentgräns har konfigurerats.
  • Kraven för att använda procentgränskonfigurationen uppfylls inte.
SELECT wg.group_id,
       wg.name,
       tf.tempdb_max_size_mb,
       CASE
           WHEN wg.group_max_tempdb_data_mb IS NOT NULL
               THEN wg.group_max_tempdb_data_mb
           WHEN wg.group_max_tempdb_data_percent IS NOT NULL AND tf.tempdb_max_size_mb IS NOT NULL
               THEN 0.01 * wg.group_max_tempdb_data_percent * tf.tempdb_max_size_mb
       ELSE NULL END AS group_effective_limit_mb
FROM sys.resource_governor_workload_groups AS wg
CROSS APPLY (
    SELECT IIF (SUM(IIF (max_size <> -1
        AND growth > 0, 1, 0)) = COUNT(1) /* autogrow up to the maxsize */
        OR SUM(IIF (max_size = -1
        AND growth = 0, 1, 0)) = COUNT(1), /* pregrown and fixed */
        SUM(IIF (growth = 0, size, max_size)) * 8 / 1024., NULL) AS tempdb_max_size_mb
    FROM sys.master_files
    WHERE database_id = 2
        AND type_desc = 'ROWS'
) AS tf;

Nästa steg