Troubleshooting Insufficient Disk Space in tempdb

W tym temacie przedstawiono procedury i zalecenia, które ułatwiają diagnozowanie i rozwiązywanie problemów powodowanych przez za mało miejsca na dysku w bazy danych tempdb.Uruchamianie w miejsce na dysku tempdb mogą powodować znaczące zakłóceniaSQL Server środowiska produkcyjnego i może zabronić aplikacji, które działają na ukończenie operacji.

tempdb wymagania dotyczące wolnego miejsca

The tempdb system database is a global zasób that is available to all users that are connected to an wystąpienie of SQL Server. The tempdb database is used to store the following objects: obiektów użytkowników, wewnętrzne obiekty i magazyny wersja.

Można użyć sys.dm_db_file_space_usage dynamicznego zarządzania widoku do kontrolowania miejsca na dysku używane przez obiektów użytkowników, wewnętrzne obiekty i wersja są przechowywane w tempdb pliki.Ponadto aby monitorować aktywność alokacji lub dezalokacji strona w tempdb poziom zadań lub sesja, można użyć sys.dm_db_session_space_usage and sys.dm_db_task_space_usage dynamicznego zarządzania widokami.Te widoki służą do identyfikowania dużej kwerendy, tabele tymczasowe lub zmienne Tabela, korzystających z dużej ilości tempdb miejsca na dysku.

Diagnozowanie problemów obszar dysku tempdb

W poniższej tabela wymieniono komunikaty o błędach, które wskazują za mało miejsca na dysku w tempdb bazy danych.Błędy te znajdują się w SQL Server Błąd logowania, a także mogą być zwracane do aplikacji uruchomione.

Błąd

Jest wywoływane, gdy

1101 lub 1105

Żadnej sesja musi przydzielić ilość miejsca w tempdb.

3959

Magazynu wersja jest zapełniony.Ten błąd pojawia się zazwyczaj po 1105 lub 1101 o błędzie w dzienniku.

3967

Magazynu wersja jest zmuszony do zmniejszenia, ponieważ tempdb jest zapełniony.

3958 lub 3966

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

tempdb problemy z miejsca na dysku są wskazuje również, gdy baza danych jest ustawiony na autogrow i szybko rośnie rozmiar bazy danych.

Monitorowanie tempdb ilości miejsca na dysku

Następujące przykłady przedstawiają sposób ustalić ilość wolnego miejsca w tempdb, obszar zajmowany przez magazynu wersja i wewnętrznych oraz obiektów użytkowników.

Określanie kwota z wolnego miejsca w tempdb

Następująca kwerenda zwraca wartość 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 kwota ilość miejsca używanego przez Magazyn w wersja

Następująca kwerenda zwraca wartość całkowitą liczbę stron używanych przez magazynu wersja oraz całkowitej ilości 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ższe transakcji pracy

Jeśli używa dużej ilości miejsca w magazynu wersja tempdb, należy określić, jaka jest najdłuższy bieżących transakcji.Ta kwerenda służy do wyświetlania listy aktywnych transakcji w kolejności, najdłuższego bieżących transakcji.

SELECT transaction_id
FROM sys.dm_tran_active_snapshot_database_transactions 
ORDER BY elapsed_time_seconds DESC;

Długo działających transakcji, która nie jest związany z operacją indeksu online wymaga magazynu dużych wersja.Ten magazyn w wersja zachowuje wszystkie wersje generowany od momentu rozpoczęcia transakcji.Transakcje kompilacji online indeksu może zająć dużo czas na zakończenie, ale magazynu w oddzielnych wersja byłaby przeznaczona wyłącznie do operacji online indeksu jest używany.W związku z tym te czynności nie zapobiegają w wersjach od innych transakcji z jego usuwania.Aby uzyskać więcej informacji zobaczObciążenie zasób wersji wiersza.

Określanie ilości miejsca używanego przez obiekty wewnętrzne

Następująca kwerenda zwraca całkowitą liczbę stron używanych przez obiekty wewnętrzne i całkowitej ilości miejsca w MB używanych przez obiekty wewnętrzne 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;

Określanie ilości miejsca używanego przez użytkownika obiekty

Następująca kwerenda zwraca wartość całkowitą liczbę stron używanych przez użytkownika obiekty i całkowitą ilość miejsca używanego przez użytkownika obiekty 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łkowita ilość miejsca (używane i wolne)

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

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

Monitorowanie miejsce używane przez kwerendy

Jednym z najczęściej spotykane typy tempdb miejsca użycia problemów jest skojarzony z dużą kwerend korzystających z dużej ilości miejsca.Ogólnie rzecz biorąc to miejsce jest używane do wewnętrznej obiekty, takie jak tabele pracy lub pliki robocze.Chociaż monitorowania zajmowane przez wewnętrzne obiekty pozwalają ilość miejsca jest używany, to nie bezpośrednio identyfikuje kwerendę, która korzysta z tego miejsca.

Następujące metody identyfikowania kwerendy, które używają większość miejsca w tempdb.Pierwsza metoda, która sprawdza, czy dane poziom partia i jest intensywnie wykorzystujących dane mniej niż drugiej metody.Druga metoda może być używana do identyfikacji określonej kwerendy tabela tymczasowej i zmiennej tabela, który zużywa miejsce na dysku, ale większej ilości danych muszą być pobierane w celu uzyskania odpowiedzi.

Metoda 1: Partia — informacje O poziom

Jeśli żądanie partia zawiera tylko kilka kwerendy i tylko jeden z nich jest złożoną kwerendę, zwykle jest wystarczająco dużo informacji, aby dowiedzieć się, po prostu wsadowy, który zużywa miejsce zamiast określonej kwerendy.

Aby kontynuować pracę z tej metoda, zadanie agenta programu SQL Server należy skonfigurować do sondowanie z sys.dm_db_session_space_usage and sys.dm_db_task_space_usage widoki dynamicznego zarządzania przy użyciu interwał sondowanie z zakres od kilku minut.Interwał sondowanie trzy minuty jest używany w następującym przykładzie.Musi sondować w obu widokach ponieważ sys.dm_db_session_space_usage nie obejmuje aktywności alokacji bieżącego aktywnego zadania.Porównywanie różnicy między przydzielonych w odstępach czas dwóch stron pozwala obliczyć, ile stron są przydzielane w między interwałami.

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

A.Uzyskiwanie miejsca przez wewnętrzne obiekty w wszystkich aktualnie uruchomionych zadań w każdej sesja.

Poniższy przykład tworzy widok all_task_usage. Kwerendy, widoku Zwraca całkowitą ilość miejsca używanego przez wewnętrzne obiekty w wszystkich aktualnie uruchomionych zadań 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.Uzyskania miejsca zużywanej przez wewnętrzne obiekty w bieżącej sesja dla obu uruchomione i zakończone zadania

Poniższy przykład tworzy widok all_session_usage. Kwerendy, widoku zwraca miejsce używane przez wszystkie obiekty wewnętrzne uruchomiony 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 podczas tych widoków są kwerendowane w odstępach czasu trzy minuty, zestawy wyników Podaj następujące informacje.

  • W 17: 00 sesja 71 przydzielonych stron 100 i dealokowane 100 stron od rozpoczęcia sesji.

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

Podczas analizowania tych informacji, można stwierdzić, że między dwoma pomiarami: Sesja przydzielone 20 000 stron wewnętrzne obiekty i nie cofnąć przydział wszystkich stron. Wskazuje na potencjalny problem.

Uwaga

Będąc administrator bazy danych może podjąć decyzję o sprawdzają, czy częściej niż trzy minuty.Jednak jeśli kwerendy działa mniej niż trzy minuty, kwerendy prawdopodobnie nie zużywa znaczną ilość miejsca w tempdb.

Aby ustalić partia, w którym jest uruchomiony w tym czasie, należy użyć Program SQL Server Profiler przechwytywaniaRPC: zakończone and SQL:BatchCompleted klas zdarzeń.

Zamiast SQL Server Profiler ma być uruchomiona DBCC INPUTBUFFER raz co trzy minuty, we wszystkich sesjach, jak pokazano w poniższym 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 O poziomie kwerendy

Czasami po prostu przegląda bufor wejściowy lub SQL Server Profiler zdarzenie SQL:BatchCompleted nie zawsze informują kwerendę, która korzysta z większość miejsca na dysku w tempdb.Następujące metoda można użyć do znalezienia tej odpowiedzi, ale te metoda wymagają zbierania więcej danych niż procedury zdefiniowane w metodzie 1.

Aby kontynuować, przy użyciu tej metoda, konfigurowanie zadanie agenta programu SQL Server zadanie, który sonduje z sys.dm_db_task_space_usage dynamiczny widok zarządzania.Interwał sondowanie powinien być krótki, raz na minuty, w porównaniu z metoda 1.Jest to krótki odstęp, ponieważ sys.dm_db_task_space_usage nie zwraca dane, jeśli nie jest aktualnie uruchomiona kwerenda (zadanie).

W kwerendzie sondowanie widoku zdefiniowanych na sys.dm_db_task_space_usage dynamiczny widok zarządzania jest połączone z sys.dm_exec_requests zwrócićsql_handle statement_start_offset, statement_end_offset, and 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 znajduje się w pamięci podręcznej, można pobrać Transact-SQL tekst kwerendy oraz plan wykonania kwerend w XML showplan format w dowolnym momencie.Aby uzyskać Transact-SQL tekst kwerendy, która zostanie wykonana, użycie sql_handle wartość a sys.dm_exec_sql_text funkcja dynamicznego zarządzania.Aby uzyskać wykonanie planu kwerendy, należy użyć plan_handle wartość a 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 znajduje się w pamięci podręcznej, można użyć jednej z następujących metod uzyskiwania Transact-SQL tekst kwerendy oraz plan wykonania kwerend.

A.Za pomocą metoda sondowanie

Sondowania z widoku all_query_usage, i uruchom następującą kwerendę do uzyskania 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 instancji unikatowy, nie trzeba zapisać duplikat sql_handle wpisów.

Aby zapisać plan uchwyt i planu XML, 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ą programu SQL Server Profiler zdarzeń

Jako alternatywę do sondowanie sys.dm_exec_sql_text and sys.dm_exec_query_plan funkcji, można użyć SQL Server Profiler zdarzenia. Brak programu profilującego zdarzenia, które mogą być używane do 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 miejsce wykorzystywane przez tabele Temp i zmienne Tabela

Podejście przypominające kwerendy sondowanie można używać do monitorowania zajmowane przez tabele tymczasowe i zmiennych tymczasowych.Aplikacje, które nabycia dużej ilości danych użytkowników wewnątrz tabel tymczasowych lub temperatura zmienne mogą być przyczyną miejsca użycia problemów w tempdb.Te tabele lub zmienne należą do obiektów użytkowników.Można użyć user_objects_alloc_page_count and user_objects_dealloc_page_count kolumnsys.dm_db_session_space_usage dynamicznego zarządzania widok i postępuj zgodnie z metod opisanych wcześniej.

Monitorowanie Alokacja strona i dezalokacji przez sesja

W poniższej tabela przedstawiono wyniki zwróconych przez sys.dm_db_file_space_usage, sys.dm_db_session_space_usage, and sys.dm_db_task_space_usage dynamicznego zarządzania widoki dla określonej sesja.Każdy wiersz reprezentuje działalność alokacji lub dezalokacji tempdb dla określonej sesja.Działanie ma na liście zdarzenie kolumna.Pozostałe kolumny zawierają wartości, które będą zwracane w kolumnach widoki dynamicznego zarządzania.

W tym scenariuszu założono, że tempdb bazy danych rozpoczyna 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 wszystkie z nich.Pierwsze 8 stron są w mieszane fragment.Pozostałe 2 strony znajdują się w zakresie jednolite.

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 do 8: używające jednego nowego fragment mieszanych

864

80

8

0

Przydzielić strona 9: używające jednego nowego fragment jednolitego

856

108

16

0

Przydzielić strona 10 z istniejącego fragment jednolitego

856

108

16

0

Cofnij przydzielanie strona 10 z istniejącego fragment jednolitego

856

108

16

0

Cofnij przydzielanie strona 9 i jednolitego fragment

864

100

16

8

Cofnij przydzielanie strona 8

864

100

16

9

Cofnij przydzielanie strona 1 do 7, a następnie zwolnij na zakresie mieszanych

872

100

16

16