Rozwiązywanie problemów za mało miejsca na dysku w tempdb

W tym temacie opisano procedury i zalecenia, które ułatwiają diagnozowanie i rozwiązywanie problemów spowodowanych za mało miejsca w bazy danych tempdb.Z miejsca na dysku w tempdb może spowodować znaczne zakłócenia w SQL Server środowiska produkcyjnego i mogą zakazać aplikacje uruchomione na ukończenie operacji.

wymagania dotyczące miejsca na tempdb

Tempdb systemowej bazy danych jest globalny zasób, który jest dostępny dla wszystkich użytkowników podłączonych do wystąpienie SQL Server.Tempdb bazy danych jest używany do przechowywania następujących obiektów: obiektów użytkowników, wewnętrzne obiekty i magazyny wersja.

Można użyć sys.dm_db_file_space_usage dynamiczny widok zarządzania, monitorowania miejsca na dysku używane przez użytkownika obiektów, obiekty wewnętrzne i wersja sklepy w tempdb pliki.Ponadto monitorowanie aktywności alokacji lub dezalokacji strona w tempdb poziom zadań lub sesja można użyć sys.dm_db_session_space_usage i sys.dm_db_task_space_usage dynamiczne zarządzanie widokami.Te widoki służą do identyfikowania duże kwerendy, tabele tymczasowe lub zmienne Tabela korzystających z dużej ilości tempdb miejsca na dysku.

Diagnozowanie problemów miejsca na dysku tempdb

Następujące tabela wyświetla komunikaty o błędach, które wskazują za mało miejsca w tempdb bazy danych.Błędy te można znaleźć w SQL Server dziennik błędówi może również zostać odesłany do uruchomionych aplikacji.

Błąd

Powstaje, gdy

1101 lub 1105

Żadnej sesja musi przydzielić miejsca w tempdb.

3959

Wersja magazynu jest zapełniony.Ten błąd zazwyczaj występuje po 1105 lub 1101 błędu w dzienniku.

3967

Magazynu wersja jest zmuszony do zmniejszenia, ponieważ tempdb jest pełny.

3958 lub 3966

Transakcji nie można odnaleźć rekordu wymaganej wersja w tempdb.

tempdb problemy z miejsca na dysku są oznaczane również, gdy baza danych jest zestaw do autogrow, i szybko wzrasta rozmiar bazy danych.

Monitorowanie tempdb miejsca na dysku

Następujące przykłady pokazują, jak określić ilość miejsca w tempdboraz miejsca przechowywania wersja i wewnętrzne, jak i obiektów użytkowników.

Określanie ilości miejsca wolne w tempdb

Następująca kwerenda zwraca całkowita liczba wolnych stron i całkowita ilość wolnego miejsca w megabajtach (MB) dostępnej w wszystkie pliki w tempdb.

SELECT SUM(unallocated_extent_page_count) AS [free pages], 
(SUM(unallocated_extent_page_count)*1.0/128) AS [free space in MB]
FROM sys.dm_db_file_space_usage;

Określanie ilości miejsca przechowywania wersji

Następująca kwerenda zwraca całkowitą liczbę stron magazynu wersja i miejsca w MB używanych przez przechowywanie wersja w tempdb.

SELECT SUM(version_store_reserved_page_count) AS [version store pages used],
(SUM(version_store_reserved_page_count)*1.0/128) AS [version store space in MB]
FROM sys.dm_db_file_space_usage;

Określanie najdłuższego transakcji uruchamianie

Jeśli magazynu wersja przy użyciu dużo miejsca w tempdb, należy określić, co jest najdłużej działają transakcji.Ta kwerenda służy do wyświetlania listy aktywnych transakcji w porządku, przez najdłuższy działającą transakcję.

SELECT transaction_id
FROM sys.dm_tran_active_snapshot_database_transactions 
ORDER BY elapsed_time_seconds DESC;

Długotrwałe transakcji, która nie jest związany z operacją indeksu online wymaga magazynu wersja duże.Magazynu w wersja śledzi wszystkie wersje generowany od momentu rozpoczęcia transakcji.Transakcje budowania indeksu online może trwać bardzo długo czas na zakończenie, ale oddzielną wersja używany Magazyn przeznaczonego do operacji online indeksu.Dlatego operacje te nie uniemożliwiają wersje z innymi transakcjami usuwaniu.Aby uzyskać więcej informacji, zobacz Obciążenie zasobów wersji wiersza.

Ustalanie miejsca zajmowanego przez obiekty wewnętrzne

Następująca kwerenda zwraca całkowitą liczbę stron, używany przez obiekty wewnętrzne i miejsca w MB używanych przez wewnętrzne obiekty w tempdb.

SELECT SUM(internal_object_reserved_page_count) AS [internal object pages used],
(SUM(internal_object_reserved_page_count)*1.0/128) AS [internal object space in MB]
FROM sys.dm_db_file_space_usage;

Ustalanie miejsca zajmowanego przez obiekty użytkownika

Następująca kwerenda zwraca całkowitą liczbę stron, używany przez obiekty użytkownik i całkowity obszar zajmowany przez obiektów użytkowników w tempdb.

SELECT SUM(user_object_reserved_page_count) AS [user object pages used],
(SUM(user_object_reserved_page_count)*1.0/128) AS [user object space in MB]
FROM sys.dm_db_file_space_usage;

Określanie całkowitą ilość miejsca (wolnego i zajętego)

Następująca kwerenda zwraca całkowitą ilość miejsca na dysku, używane przez wszystkie pliki w tempdb.

SELECT SUM(size)*1.0/128 AS [size in MB]
FROM tempdb.sys.database_files

Monitorowanie zajmowane przez kwerendy

Jednym z najczęściej spotykanych rodzajów tempdb miejsca użycia problemów jest skojarzony z dużych kwerend używających dużej ilości miejsca.Ogólnie to miejsce jest używane wewnętrzne obiekty, takie jak tabele pracy lub pracy plików.Chociaż monitorowania miejsca używanego przez obiekty wewnętrzne informuje ile miejsca jest używany, to nie bezpośrednio identyfikuje kwerenda, która używa tego miejsca.

Następujące metody pomagają kwerendy, które używają najbardziej miejsca w tempdb.Pierwsza metoda sprawdza dane poziom partia i jest mniej intensywny danych niż druga metoda.Druga metoda może służyć do identyfikacji określonej kwerendy, tymczasowej tabela lub zmiennej tabela, który zużywa miejsce na dysku, ale więcej danych muszą być pobierane w celu uzyskania odpowiedzi.

Metoda 1: Informacje dotyczące przetwarzania wsadowego

Jeśli partia zawiera kilka kwerend, a tylko jedna z nich jest złożona kwerenda, jest to zwykle wystarczające informacje, aby wiedzieć tylko partii, który zużywa miejsce zamiast określonej kwerendy.

Aby kontynuować tę metodę, SQL Server zadania agenta należy zdefiniować sondowanie z sys.dm_db_session_space_usage i sys.dm_db_task_space_usage widoki dynamiczne zarządzanie przy użyciu interwał sondowania w zakresie kilka minut.W poniższym przykładzie jest używany interwał sondowanie trzy minuty.Muszą sondować w obu widokach ponieważ sys.dm_db_session_space_usage nie obejmuje działalność alokacji bieżącego zadania aktywne.Porównanie różnicy między przydzielonych na dwóch stron czas odstępach pozwala obliczyć, ile stron są przydzielane w między interwałami.

Poniższe przykłady zawierają kwerend, które są wymagane dla zadanie agenta programu SQL Server.

A.Uzyskiwanie miejsca zużytego przez wewnętrzne obiekty w wszystkie uruchomione zadania w każdej sesja.

Poniższy przykład tworzy widok all_task_usage.Kwerendy, widoku zwraca całkowity obszar zajmowany przez wewnętrzne obiekty w wszystkie uruchomione zadania tempdb.

CREATE VIEW all_task_usage
AS 
    SELECT session_id, 
      SUM(internal_objects_alloc_page_count) AS task_internal_objects_alloc_page_count,
      SUM(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count 
    FROM sys.dm_db_task_space_usage 
    GROUP BY session_id;
GO

B.Uzyskiwanie miejsca zużytego przez wewnętrzne obiekty w bieżącej sesja dla obu uruchamianie i ukończyć zadania

Poniższy przykład tworzy widok all_session_usage.Kwerendy, widoku zwraca miejsce używane przez wszystkie wewnętrzne obiekty z systemem i wykonane zadania w tempdb.

CREATE VIEW all_session_usage 
AS
    SELECT R1.session_id,
        R1.internal_objects_alloc_page_count 
        + R2.task_internal_objects_alloc_page_count AS session_internal_objects_alloc_page_count,
        R1.internal_objects_dealloc_page_count 
        + R2.task_internal_objects_dealloc_page_count AS session_internal_objects_dealloc_page_count
    FROM sys.dm_db_session_space_usage AS R1 
    INNER JOIN all_task_usage AS R2 ON R1.session_id = R2.session_id;
GO

Załóżmy, że te widoki są badane kwerendami interwałem trzy minuty, zestawy wyników Podaj następujące informacje.

  • 17:00 sesja 71 przydzielone 100 stron i cofniętych przydziałów 100 stron od rozpoczęcia sesja.

  • At 5:03 P.M., session 71 allocated 20100 pages and deallocated 100 pages since the start of the session.

Podczas analizowania informacji można stwierdzić, że między dwoma pomiarami: Sesja przydzielone 20 000 stron wewnętrzne obiekty i nie deallocate, wszystkie strony.Wskazuje potencjalny problem.

Ostrzeżenie

Jako administrator bazy danych może zdecydować o sondować częściej niż trzy minuty.Jednakże, jeśli kwerenda jest wykonywana przez mniej niż trzy minuty, kwerenda prawdopodobnie nie zajmie znaczną ilość miejsca w tempdb.

Do określenia partia, który działa podczas tego czas, użyj Programu SQL Profiler do przechwytywania RPC: ukończono i SQL:BatchCompleted klas zdarzeń.

Zamiast SQL Server Profiler jest uruchomienie dbcc inputbuffer po co trzy minuty dla wszystkich sesji, jak pokazano w następującym przykładzie.

DECLARE @max int;
DECLARE @i int;
SELECT @max = max (session_id)
FROM sys.dm_exec_sessions
SET @i = 51
  WHILE @i <= @max BEGIN
         IF EXISTS (SELECT session_id FROM sys.dm_exec_sessions
                    WHERE session_id=@i)
         DBCC INPUTBUFFER (@i)
         SET @i=@i+1
         END;

Metoda 2: Informacje dotyczące kwerend

Czasami wystarczy przegląda bufor wejściowy lub SQL Server Profiler zdarzenie SQL:BatchCompleted nie zawsze sprawdzić kwerendę, która używa większości miejsca na dysku w tempdb.Następujące metody można znaleźć tej odpowiedzi, ale wymagają tych metod zbierania więcej danych niż procedur określonych w metodzie 1.

Aby kontynuować tę metoda, konfigurowanie SQL Server zadanie agenta zadanie, który sonduje z sys.dm_db_task_space_usage dynamiczny widok zarządzania.Interwał sondowanie powinien być krótki, raz w minutę w porównaniu z metody 1.Jest to krótki interwał, ponieważ sys.dm_db_task_space_usage nie zwraca dane, jeśli kwerenda (zadanie) nie jest uruchomiona.

W zapytanie sondowanie, widok zdefiniowany na sys.dm_db_task_space_usage dynamiczny widok zarządzania jest połączone z sys.dm_exec_requests do zwrócenia sql_handle, statement_start_offset, statement_end_offset, i plan_handle kolumny.

CREATE VIEW all_request_usage
AS 
  SELECT session_id, request_id, 
      SUM(internal_objects_alloc_page_count) AS request_internal_objects_alloc_page_count,
      SUM(internal_objects_dealloc_page_count)AS request_internal_objects_dealloc_page_count 
  FROM sys.dm_db_task_space_usage 
  GROUP BY session_id, request_id;
GO
CREATE VIEW all_query_usage
AS
  SELECT R1.session_id, R1.request_id, 
      R1.request_internal_objects_alloc_page_count, R1.request_internal_objects_dealloc_page_count,
      R2.sql_handle, R2.statement_start_offset, R2.statement_end_offset, R2.plan_handle
  FROM all_request_usage R1
  INNER JOIN sys.dm_exec_requests R2 ON R1.session_id = R2.session_id and R1.request_id = R2.request_id;
GO

Jeżeli plan kwerend jest w pamięci podręcznej, można pobrać Transact-SQL tekst kwerendy i plan wykonania kwerend w XML showplan format w dowolnym czas.Aby uzyskać Transact-SQL tekst kwerendy, która jest wykonywana, użyj sql_handle wartość i sys.dm_exec_sql_text funkcja dynamicznego zarządzania.Aby uzyskać wykonanie planu kwerend, użyj plan_handle wartość i sys.dm_exec_query_plan funkcja dynamicznego zarządzania.

SELECT * FROM sys.dm_exec_sql_text(@sql_handle);
SELECT * FROM sys.dm_exec_query_plan(@plan_handle);

Jeżeli plan kwerend nie jest w pamięci podręcznej, można użyć jednej z następujących metod uzyskiwania Transact-SQL tekst kwerendy i wykonanie planu kwerend.

A.Przy użyciu metoda sondowanie

Sondowania z widoku all_query_usage, i uruchom następującą kwerendę, aby uzyskać tekst kwerendy:

SELECT R1.sql_handle, R2.text 
FROM all_query_usage AS R1
OUTER APPLY sys.dm_exec_sql_text(R1.sql_handle) AS R2;

Ponieważ sql_handle powinien być unikatowy dla każdej partia unikatowy, nie trzeba zapisać duplikat sql_handle wpisów.

Aby zapisać plan uchwyt i XML plan, uruchom następującą kwerendę.

SELECT R1.plan_handle, R2.query_plan 
FROM all_query_usage AS R1
OUTER APPLY sys.dm_exec_query_plan(R1.plan_handle) AS R2;

B.Za pomocą SQL Server Profiler zdarzenia

Jako alternatywę do sondowanie sys.dm_exec_sql_text i sys.dm_exec_query_plan funkcje, można użyć SQL Server Profiler zdarzenia.Istnieją profiler zdarzenia, które mogą być używane do przechwytywania planu kwerend i tekst kwerendy, który jest generowany.Na przykład zdarzenie 165 zwraca statystyki wydajności dla śledzenia, tekst SQL, planów kwerend i statystyk kwerendy.

Monitorowanie zajmowane przez zmienne tabeli i tabele Temp

Można użyć podobne podejście sondowanie kwerendy dla monitorowania miejsca używanego przez tabele tymczasowe i zmiennych tymczasowych.Aplikacje, które nabywają dużej ilości danych użytkownika wewnątrz tabel tymczasowych lub temp zmiennych może poważnie miejsca użycia w tempdb.Te tabele lub zmienne należą do obiektów użytkowników.Można użyć user_objects_alloc_page_count i user_objects_dealloc_page_count kolumn w sys.dm_db_session_space_usage dynamiczny widok zarządzania i postępuj zgodnie z wcześniejszym opisem metod.

Monitorowanie podział strony i dezalokacji sesji

W poniższej tabela przedstawiono wyniki zwracane przez sys.dm_db_file_space_usage, sys.dm_db_session_space_usage, i sys.dm_db_task_space_usage widoki dynamicznego zarządzania dla określonej sesja.Każdy wiersz reprezentuje alokacji lub dezalokacji aktywności w tempdb dla określonej sesja.Działanie jest wymieniony w zdarzenia kolumna.Pozostałe kolumny zawierają wartości, które zostałaby zwrócona w kolumnach widoki dynamiczne zarządzanie.

W tym scenariuszu założono, że tempdb bazy danych zaczyna się od zakresy nieprzydzielone 872 stron i zakresów zarezerwowanych 100 stron w obiekcie użytkownika.sesja przydziela 10 stron dla tabela użytkownika, a następnie zwalnia je wszystkie.Pierwsze 8 stron są w mieszanym fragment.Pozostałe strony 2 są w jednolitych fragment.

Zdarzenie

dm_db_file_space_usage

Kolumna unallocated_extent_page_count

dm_db_file_space_usage

Kolumna user_object_reserved_page_count

dm_db_session_space_usage

i dm_db_task_space_usage

Kolumna user_object_alloc_page_count

dm_db_session_space_usage

i dm_db_task_space_usage

Kolumna user_object_dealloc_page_count

Start

872

100

0

0

Przydzielić strona 1 z istniejącego fragment mieszanych

872

100

1

0

Przydzielanie strony 2-8: używające jednego nowego mieszanego fragment

864

80

8

0

Przydzielić strona 9: używające jeden nowy fragment jednolitej

856

108

16

0

Przydzielić strona 10 z fragment istniejących jednolite

856

108

16

0

Cofnij przydzielanie strona 10 z fragment istniejących jednolite

856

108

16

0

Cofnij przydzielanie strona 9 i jednolitychfragment

864

100

16

8

Cofnij przydzielanie strona 8

864

100

16

9

Cofnij przydzielanie strona 1 do 7 i deallocate na mieszanychfragment

872

100

16

16