Zarządzanie zasobami przestrzeni bazy danych Tempdb

Dotyczy: SQL Server 2025 (17.x) i nowsze wersje

Po włączeniu tempdb zarządzania zasobami przestrzeni, zwiększasz niezawodność i unikasz przestojów, uniemożliwiając uruchamianie zapytań lub obciążeń, które zużywają dużą ilość przestrzeni w tempdb.

Począwszy od SQL Server 2025 (17.x), możesz użyć zarządcy zasobów, aby wymusić limit całkowitej tempdb ilości miejsca zużywanego przez grupę obciążeń. Gdy żądanie (zapytanie) próbuje przekroczyć limit, zarządca zasobów przerywa je z wyraźnym błędem wskazującym, że limit grupy obciążeń jest wymuszany.

W efekcie można podzielić przestrzeń udostępnioną tempdb na różne obciążenia. Można na przykład ustawić wyższy limit dla grupy obciążeń używanej przez aplikację o znaczeniu krytycznym i ustawić niższy limit dla default grupy obciążeń używanej przez wszystkie inne obciążenia.

Przykłady konfiguracji krok po kroku można znaleźć w temacie Samouczek: Przykłady konfigurowania zarządzania zasobami przestrzeni tempdb.

Rozpocznij pracę z zarządcą zasobów

Zarządca zasobów udostępnia elastyczną strukturę do ustawiania różnych tempdb limitów przestrzeni dla różnych aplikacji, użytkowników, grup użytkowników itp. Limity można również ustawić na podstawie logiki niestandardowej.

Jeśli dopiero zaczynasz korzystać z zarządcy zasobów w SQL Server, zobacz zarządcę zasobów, aby dowiedzieć się więcej na temat jego pojęć i możliwości.

Aby zapoznać się z przewodnikiem po konfiguracji zarządcy zasobów i najlepszymi rozwiązaniami, zobacz Tutorial: Resource governor configuration examples and best practices (Samouczek: przykłady konfiguracji zarządcy zasobów i najlepsze rozwiązania).

Ustawianie limitów użycia miejsca w bazie danych tempdb

Możesz ograniczyć tempdb zużycie miejsca przez grupę roboczą na jeden z następujących dwóch sposobów:

  • Ustaw stały limit przy użyciu argumentu GROUP_MAX_TEMPDB_DATA_MB .

    Użyj ustalonego limitu, gdy znasz wymagania dotyczące użycia obciążenia tempdb z wyprzedzeniem lub gdy tempdb rozmiar nie ulegnie zmianie.

  • Ustaw limit procentu przy użyciu argumentu GROUP_MAX_TEMPDB_DATA_PERCENT .

    Użyj limitu procentowego, jeśli możesz zmienić maksymalny rozmiar tempdb w czasie i chcesz tempdb , aby miejsce dostępne dla każdej grupy obciążeń zmieniało się proporcjonalnie bez zmiany konfiguracji grupy obciążeń. Na przykład, jeśli zwiększysz rozmiar maszyny wirtualnej na platformie Azure z uruchomionym SQL Server i zwiększysz maksymalny rozmiar tempdb, przestrzeń tempdb dostępna dla każdej grupy obciążeń z limitem procentowym również się zwiększa.

Aby uzyskać więcej informacji o argumentach GROUP_MAX_TEMPDB_DATA_MB i GROUP_MAX_TEMPDB_DATA_PERCENT, zobacz CREATE WORKLOAD GROUP lub ALTER WORKLOAD GROUP.

Jeśli określisz zarówno stałe, jak i procentowe limity dla tej samej grupy obciążeń, stały limit ma pierwszeństwo przed limitem procentu.

W danym wystąpieniu programu SQL Server możesz mieć kombinację grup obciążeń ze stałymi limitami, limitami procentowymi lub bez limitów tempdb zużycia miejsca. Aby wyświetlić efektywne limity, zobacz przykład Wyświetlanie efektywnych limitów miejsca w tempdb dla każdej grupy obciążeń.

Konfiguracja limitu procentowego

Po uruchomieniu instrukcji ALTER RESOURCE GOVERNOR RECONFIGURE limity procentowe obowiązują zgodnie z następującą tabelą:

Konfiguracja Opis Maksymalny rozmiar bazy danych Tempdb (100%) Limit procentowy obowiązuje
- GROUP_MAX_TEMPDB_DATA_MB nie jest ustawiona
- W przypadku wszystkich plików danych MAXSIZE nie dotyczy UNLIMITED
- Dla wszystkich plików danych wartość FILEGROWTH nie wynosi zero
tempdb pliki danych mogą się automatycznie powiększać do maksymalnego rozmiaru Suma MAXSIZE wartości dla wszystkich plików danych Tak
- GROUP_MAX_TEMPDB_DATA_MB nie jest ustawiona
- Dla wszystkich plików danych MAXSIZE jest UNLIMITED
- Dla wszystkich plików danych, FILEGROWTH wynosi zero
tempdb pliki danych są wstępnie dopasowywane do ich zamierzonych rozmiarów i nie mogą się rozwijać dalej Suma SIZE wartości dla wszystkich plików danych Tak
Wszystkie inne konfiguracje Nie.

Aby wyświetlić konfigurację tempdb, zobacz przykład Wyświetlanie konfiguracji plików danych tempdb.

W przypadku korzystania z limitów procentowych należy wziąć pod uwagę następujące kwestie:

  • Jeśli ustawisz GROUP_MAX_TEMPDB_DATA_PERCENT i wykonasz instrukcję ALTER RESOURCE GOVERNOR RECONFIGURE , ale konfiguracja pliku danych nie spełnia wymagań, instrukcja zakończy się pomyślnie, a limity procentowe są przechowywane, ale nie są wymuszane. W takim przypadku zostanie wyświetlony komunikat ostrzegawczy 10989, ważność 10, która jest również rejestrowana w dzienniku błędów:

    GROUP_MAX_TEMPDB_DATA_PERCENT is not in effect because tempdb
    configuration requirements aren't met.
    
  • Aby wdrożyć limity procentowe, skonfiguruj ponownie tempdb pliki danych, aby spełnić wymagania i ponownie wykonaj ALTER RESOURCE GOVERNOR RECONFIGURE. Aby uzyskać więcej informacji na temat konfigurowania SIZEplików , FILEGROWTHi MAXSIZE, zobacz ALTER DATABASE Opcje plików i grup plików.

  • Jeśli obowiązuje limit procentu i dodajesz, usuwasz lub zmieniasz rozmiar tempdb plików danych, musisz wykonać ALTER RESOURCE GOVERNOR RECONFIGURE polecenie , aby zaktualizować zarządcę zasobów przy użyciu nowego maksymalnego rozmiaru tempdb (100%).

Uwaga / Notatka

W przypadku nowego wystąpienia SQL Server plik danych MAXSIZE ma wartość UNLIMITED, a FILEGROWTH jest większe od zera, co oznacza, że limity procentowe nie są efektywne. Aby użyć limitów procentowych, należy wykonać następujące czynności:

  • Wstępnie przenieś tempdb pliki danych do ich zamierzonych rozmiarów i ustaw na FILEGROWTH zero.
  • Ustaw MAXSIZE każdego pliku danych na ograniczoną wartość.
  • Dla każdego tempdb woluminu pliku danych upewnij się, że suma MAXSIZE wartości dla plików na woluminie jest mniejsza lub równa dostępnej przestrzeni dyskowej na woluminie. Jeśli na przykład wolumin ma 100 GB wolnego miejsca i zawiera dwa tempdb pliki danych, ustaw MAXSIZE każdy plik na rozmiar 50 GB lub mniej.

Jak to działa

W tej sekcji opisano szczegółowo zarządzanie zasobami kosmicznymi.

  • W miarę przydzielania i cofania przydziału stron tempdb danych zarządca zasobów utrzymuje księgowość tempdb miejsca zużywanego przez każdą grupę obciążeń.

    Jeśli funkcja Resource Governor jest włączona i dla grupy obciążeń ustawiono limit wykorzystania przestrzeni tempdb, a żądanie (zapytanie) uruchomione w tej grupie obciążeń próbuje spowodować, że łączne wykorzystanie przestrzeni tempdb przez grupę przekroczy ten limit, żądanie zostanie przerwane z błędem 1138 o poziomie ważności 17:

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

    Gdy żądanie zostanie przerwane z błędem 1138, wartość w kolumnie total_tempdb_data_limit_violation_count widoku dynamicznego zarządzania sys.dm_resource_governor_workload_groups jest zwiększona o jeden, a rozszerzone zdarzenie tempdb_data_workload_group_limit_reached zostaje uruchomione.

  • Zarządca zasobów śledzi wszystkie tempdb użycia, które można przypisać grupie roboczej, w tym tabele tymczasowe, zmienne (w tym zmienne tabelowe), parametry wartości tabeli, tabele nietymczasowe, kursory i tempdb użycie podczas przetwarzania zapytań, takie jak przepełnienia, tabele robocze i pliki robocze.

    Zużycie miejsca dla globalnych tabel tymczasowych i tabel nietymczasowych w tempdb jest uwzględniane w grupie roboczej, która wstawia pierwszy wiersz do tabeli, nawet jeśli sesje w innych grupach roboczych dodają, modyfikują lub usuwają wiersze w tej samej tabeli.

  • Skonfigurowane tempdb limity użycia dla każdej grupy obciążeń są widoczne w widoku katalogu sys.resource_governor_workload_groups w kolumnach group_max_tempdb_data_mb i group_max_tempdb_data_percent .

    Bieżąca konsumpcja i szczytowa konsumpcja tempdb miejsca dla grupy obciążeń są widoczne w widoku dynamicznym sys.dm_resource_governor_workload_groups w kolumnach tempdb_data_space_kb i peak_tempdb_data_space_kb.

    Wskazówka

    kolumny tempdb_data_space_kb i peak_tempdb_data_space_kb w sys.dm_resource_governor_workload_groups są zachowywane, nawet jeśli nie ustawiono żadnych limitów zużycia miejsca tempdb.

    Możesz utworzyć funkcję klasyfikatora i grupy obciążeń bez uprzedniego ustawiania limitów. Monitoruj tempdb użycie poszczególnych grup w miarę upływu czasu, aby ustanowić reprezentatywne wzorce użycia, a następnie ustaw limity zgodnie z potrzebami.

  • tempdb użycie przez magazyny wersji, w tym magazyn wersji trwałej (PVS), gdy przyspieszone odzyskiwanie bazy danych (ADR) jest włączone w tempdb, nie podlega regulacji, ponieważ wersje wierszy mogą być używane przez różne grupy obciążeń.

  • Zużycie miejsca w programie tempdb jest uwzględniane jako liczba używanych stron danych o rozmiarze 8 KB. Nawet jeśli strona nie jest całkowicie wypełniona danymi, dodaje 8 KB do tempdb użycia przez grupę obciążeń.

  • tempdb zarządzanie przestrzenią jest prowadzone przez cały okres istnienia grupy roboczej. Jeśli grupa obciążeń zostanie usunięta, gdy globalne tabele tymczasowe lub tabele nietymczasowe z danymi przypisanymi do tej grupy obciążeń pozostaną w tempdb, miejsce używane przez te tabele nie jest uwzględniane w żadnej innej grupie obciążeń.

  • tempdb zarządzanie zasobami przestrzeni kontroluje przestrzeń w tempdb plikach danych, ale nie przestrzeń dyskową na woluminach podstawowych. Jeśli wcześniej nie zwiększysz rozmiaru plików danych tempdb do ich docelowych rozmiarów, miejsce na woluminach, na których znajduje się tempdb, może zostać zajęte przez inne pliki. Jeśli nie pozostało miejsca na tempdb zwiększenie rozmiaru plików danych, to tempdb może zabraknąć miejsca, zanim zostanie osiągnięty limit przestrzeni dla grupy roboczej na zużycie przestrzeni tempdb.

  • Zarządzanie zasobami przestrzeni w programie tempdb dotyczy plików danych, ale nie pliku dziennika transakcji. Aby upewnić się, że dziennik transakcji tempdb nie zużywa dużej ilości miejsca, włącz ADR w tempdb.

Różnice w śledzeniu przestrzeni na poziomie sesji

Widok DMV sys.dm_db_session_space_usage zapewnia tempdb statystyki alokacji i dealokacji przestrzeni dla każdej sesji. Nawet jeśli w grupie obciążeń istnieje tylko jedna sesja, statystyki użycia miejsca z tego widoku DMV mogą nie być dokładnie zgodne ze statystykami widoku sys.dm_resource_governor_workload_groups , z następujących powodów:

  • W przeciwieństwie do sys.dm_resource_governor_workload_groups, sys.dm_db_session_space_usage:
    • Nie odzwierciedla tempdb wykorzystania miejsca przez obecnie wykonywane zadania. Statystyki w programie sys.dm_db_session_space_usage są aktualizowane po zakończeniu zadania. Statystyki w programie sys.dm_resource_governor_workload_groups są stale aktualizowane.
    • Nie śledzi stron mapy alokacji indeksu (IAM). Aby uzyskać więcej informacji, zobacz Podręcznik architektury strony i zakresu.
  • Po usunięciu wierszy lub po usunięciu albo obcięciu tabeli, indeksu bądź partycji silnik bazy danych zwalnia strony danych. Zwolnienie pamięci może być przeprowadzane synchronicznie lub realizowane przez asynchroniczny proces działający w tle. sys.dm_resource_governor_workload_groups odzwierciedla te dealokacje stron w miarę ich występowania, nawet jeśli sesja, która spowodowała te dealokacje, została zamknięta i nie jest już obecna w sys.dm_db_session_space_usage.

Najlepsze rozwiązania dotyczące ładu zasobów przestrzeni bazy danych tempdb

Przed skonfigurowaniem tempdb zarządzania zasobami przestrzeni należy wziąć pod uwagę następujące najlepsze praktyki:

  • Zapoznaj się z ogólnymi najlepszymi rozwiązaniami dotyczącymi zarządcy zasobów.

  • W przypadku większości scenariuszy należy unikać ustawiania limitu tempdb zużycia miejsca na małą wartość lub zero, szczególnie w przypadku default grupy obciążeń. Jeśli ustawisz ten limit na niewielką wartość lub zero, wiele typowych zadań może zacząć kończyć się niepowodzeniem, jeśli wymagają przydzielenia miejsca w tempdb. Jeśli na przykład ustawiono stały lub procentowy limit na 0 dla default grupy obciążeń, być może nie będzie można otworzyć Eksploratora obiektów w programie SQL Server Management Studio (SSMS).

  • Jeśli nie utworzysz niestandardowych grup obciążeń i funkcji klasyfikującej, która przypisuje obciążenia do przeznaczonych dla nich grup, unikaj ograniczania użycia grupy obciążeń tempdb przez default. Jeśli ograniczysz tempdb zużycie miejsca przez grupę default obciążeń, zapytania mogą zwracać błąd 1138. Ten błąd występuje, gdy tempdb nadal ma niewykorzystaną przestrzeń, której nie może wykorzystać żadne obciążenie użytkownika.

  • Suma GROUP_MAX_TEMPDB_DATA_MB wartości dla wszystkich grup obciążeń może przekraczać maksymalny tempdb rozmiar. Jeśli na przykład maksymalny tempdb rozmiar wynosi 100 GB, GROUP_MAX_TEMPDB_DATA_MB limity dla grupy obciążeń A i grupy obciążeń B mogą wynosić 80 GB.

    Takie podejście nadal uniemożliwia każdej grupie obciążeń zużycie całego miejsca w tempdb, pozostawiając 20 GB dla innych grup obciążeń. Jednocześnie unikasz niepotrzebnych przerwań zapytań, gdy tempdb wolne miejsce jest nadal dostępne, ponieważ grupy obciążeń A i B prawdopodobnie nie będą zużywać dużej ilości tempdb miejsca w tym samym czasie.

    Podobnie suma GROUP_MAX_TEMPDB_DATA_PERCENT wartości dla wszystkich grup obciążeń może przekroczyć 100 procent. Jeśli wiesz, że wiele grup jest mało prawdopodobne, że spowodują wysokie tempdb obciążenie w tym samym czasie, możesz przydzielić więcej tempdb miejsca do każdej grupy.

Examples

Wyświetlanie konfiguracji pliku danych bazy danych tempdb

Następujące zapytanie przedstawia bieżącą tempdb konfigurację pliku danych:

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';

Dla danego pliku w zestawie wyników:

  • Jeśli kolumna maxsize_mb jest NULL, to MAXSIZE jest UNLIMITED.
  • Gdy wartość filegrowth_mb lub filegrowth_percent jest równa zero, wtedy FILEGROWTH jest równe zero.

Wyświetlanie obowiązujących limitów miejsca w bazie danych tempdb na grupę obciążeń

Poniższe zapytanie przedstawia efektywny tempdb limit zużycia miejsca dla każdej grupy obciążeń. Limit jest zwracany w megabajtach dla konfiguracji limitu stałego lub procentowego limitu .

Jeśli kolumna group_effective_limit_mb to NULL, oznacza to jedną z następujących wartości:

  • Nie skonfigurowano ani stałego, ani procentowego limitu.
  • Wymagania dotyczące korzystania z konfiguracji limitu procentowego nie są spełnione.
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;

Następny krok