Udostępnij za pośrednictwem


sys.dm_exec_requests (Transact-SQL)

Dotyczy:programu SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)punkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft Fabric

Zwraca informacje o każdym żądaniu wykonywanym w programie SQL Server. Aby uzyskać więcej informacji na temat żądań, zobacz Przewodnik dotyczący architektury wątków i zadań.

Uwaga

Aby wywołać tę funkcję z dedykowanej puli SQL w usłudze Azure Synapse Analytics lub Analytics Platform System (PDW), zobacz sys.dm_pdw_exec_requests. W przypadku bezserwerowej puli SQL lub usługi Microsoft Fabric użyj polecenia sys.dm_exec_requests.

Nazwa kolumny Typ danych Opis
session_id smallint Identyfikator sesji, z którą jest związane to żądanie. Nie może być null.
request_id int Identyfikator żądania. Unikatowy w kontekście sesji. Nie może być null.
start_time data/godzina Sygnatura czasowa po odebraniu żądania. Nie może być null.
status nvarchar(30) Stan żądania. Może być jedną z następujących wartości:

tło
cofnięcie
uruchomiono
wykonywalny
uśpienie
zawieszony

Nie może być null.
command nvarchar(32) Określa bieżący typ przetwarzanego polecenia. Typowe typy poleceń obejmują następujące wartości:

Wybierz
INSERT
AKTUALIZACJA
USUŃ
DZIENNIK KOPII ZAPASOWYCH
KOPIA ZAPASOWA BAZA DANYCH
DBCC
DLA

Tekst żądania można pobrać przy użyciu sys.dm_exec_sql_text elementu z odpowiadającym sql_handle im żądaniem. Procesy systemu wewnętrznego ustawiają polecenie na podstawie typu wykonywanego zadania. Zadania mogą zawierać następujące wartości:

MONITOR BLOKADY
CHECKPOINTLAZY
PISARZ

Nie może być null.
sql_handle varbinary(64) Token, który jednoznacznie identyfikuje partię lub procedurę składowaną, której częścią jest zapytanie. Zmienna mogąca przyjmować wartość null.
statement_start_offset int Wskazuje, że w bajtach, począwszy od 0, pozycja początkowa aktualnie wykonywanej instrukcji dla aktualnie wykonywanego obiektu wsadowego lub utrwalonego. Można używać razem z sql_handlefunkcją , statement_end_offseti funkcją sys.dm_exec_sql_text dynamicznego zarządzania w celu pobrania aktualnie wykonywanej instrukcji dla żądania. Zmienna mogąca przyjmować wartość null.
statement_end_offset int Wskazuje, że w bajtach, począwszy od 0, końcowa pozycja aktualnie wykonywanej instrukcji dla aktualnie wykonywanego obiektu wsadowego lub utrwalonego. Można używać razem z sql_handlefunkcją , statement_start_offseti funkcją sys.dm_exec_sql_text dynamicznego zarządzania w celu pobrania aktualnie wykonywanej instrukcji dla żądania. Zmienna mogąca przyjmować wartość null.
plan_handle varbinary(64) Token, który jednoznacznie identyfikuje plan wykonywania zapytania dla aktualnie wykonywanej partii. Zmienna mogąca przyjmować wartość null.
database_id smallint Identyfikator bazy danych, względem którego jest wykonywane żądanie. Nie może być null.

W usłudze Azure SQL Database wartości są unikatowe w ramach pojedynczej bazy danych lub elastycznej puli, ale nie w obrębie serwera logicznego.
user_id int Identyfikator użytkownika, który przesłał żądanie. Nie może być null.
connection_id unikalnyidentyfikator Identyfikator połączenia, na którym dotarło żądanie. Zmienna mogąca przyjmować wartość null.
blocking_session_id smallint Identyfikator sesji, która blokuje żądanie. Jeśli ta kolumna ma NULL wartość lub 0, żądanie nie jest zablokowane lub informacje o sesji sesji blokującej nie są dostępne (lub nie można ich zidentyfikować). Aby uzyskać więcej informacji, zobacz Omówienie i rozwiązywanie problemów z blokowaniem programu SQL Server.

-2 = Zasób blokujący jest własnością oddzielonej transakcji rozproszonej.

-3 = Zasób blokujący jest własnością transakcji odroczonego odzyskiwania.

-4 = session_id nie można określić właściciela zatrzaśnięć blokującego w tej chwili z powodu przejść stanu zatrzaśnięć wewnętrznych.

-5 = session_id nie można określić właściciela zatrzaśnięć blokującego, ponieważ nie jest on śledzony dla tego typu zatrzaśnięć (na przykład dla zatrzaśnięć SH).

Sama w sobie blocking_session_id-5 nie wskazuje problemu z wydajnością. -5 wskazuje, że sesja oczekuje na zakończenie akcji asynchronicznej. Przed -5 wprowadzeniem ta sama sesja wykazałaby blocking_session_id0wartość , mimo że nadal była w stanie oczekiwania.

W zależności od obciążenia obserwowanie blocking_session_id = -5 może być typowym wystąpieniem.
wait_type nvarchar(60) Jeśli żądanie jest obecnie zablokowane, ta kolumna zwraca typ oczekiwania. Zmienna mogąca przyjmować wartość null.

Aby uzyskać informacje o typach oczekiwania, zobacz sys.dm_os_wait_stats.
wait_time int Jeśli żądanie jest obecnie zablokowane, ta kolumna zwraca czas trwania w milisekundach bieżącego oczekiwania. Nie może być null.
last_wait_type nvarchar(60) Jeśli to żądanie zostało wcześniej zablokowane, ta kolumna zwraca typ ostatniego oczekiwania. Nie może być null.
wait_resource nvarchar(256) Jeśli żądanie jest obecnie zablokowane, ta kolumna zwraca zasób, dla którego żądanie oczekuje obecnie. Nie może być null.
open_transaction_count int Liczba otwartych transakcji dla tego żądania. Nie może być null.
open_resultset_count int Liczba otwartych zestawów wyników dla tego żądania. Nie może być null.
transaction_id bigint Identyfikator transakcji, w której jest wykonywane to żądanie. Nie może być null.
context_info varbinary(128) CONTEXT_INFO wartość sesji. Zmienna mogąca przyjmować wartość null.
percent_complete rzeczywiste Procent wykonanej pracy dla następujących poleceń:

ALTER INDEX REORGANIZE
AUTO_SHRINK opcja z ALTER DATABASE
BACKUP DATABASE
DBCC CHECKDB
DBCC CHECKFILEGROUP
DBCC CHECKTABLE
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
RECOVERY
RESTORE DATABASE
ROLLBACK
TDE ENCRYPTION

Nie może być null.
estimated_completion_time bigint Tylko wewnętrzne. Nie może być null.
cpu_time int Czas procesora CPU w milisekundach używany przez żądanie. Nie może być null.
total_elapsed_time int Łączny czas upłynął w milisekundach od momentu przybycia żądania. Nie może być null.
scheduler_id int Identyfikator harmonogramu, który planuje to żądanie. Zmienna mogąca przyjmować wartość null.
task_address varbinary(8) Adres pamięci przydzielony do zadania skojarzonego z tym żądaniem. Zmienna mogąca przyjmować wartość null.
reads bigint Liczba odczytów wykonywanych przez to żądanie. Nie może być null.
writes bigint Liczba zapisów wykonanych przez to żądanie. Nie może być null.
logical_reads bigint Liczba odczytów logicznych, które zostały wykonane przez żądanie. Nie może być null.
text_size int Ustawienie TEXTSIZE dla tego żądania. Nie może być null.
language nvarchar(128) Ustawienie języka dla żądania. Zmienna mogąca przyjmować wartość null.
date_format nvarchar(3) Ustawienie DATEFORMAT dla żądania. Zmienna mogąca przyjmować wartość null.
date_first smallint Ustawienie DATEFIRST dla żądania. Nie może być null.
quoted_identifier bit 1 = QUOTED_IDENTIFIER jest włączona dla żądania. W przeciwnym razie wartość to 0.

Nie może być null.
arithabort bit 1 = ustawienie ARITHABORT jest włączone dla żądania. W przeciwnym razie wartość to 0.

Nie może być null.
ansi_null_dflt_on bit 1 = ustawienie ANSI_NULL_DFLT_ON jest włączone dla żądania. W przeciwnym razie wartość to 0.

Nie może być null.
ansi_defaults bit 1 = ustawienie ANSI_DEFAULTS jest włączone dla żądania. W przeciwnym razie wartość to 0.

Nie może być null.
ansi_warnings bit 1 = ustawienie ANSI_WARNINGS jest włączone dla żądania. W przeciwnym razie wartość to 0.

Nie może być null.
ansi_padding bit 1 = ustawienie ANSI_PADDING jest włączone dla żądania.

W przeciwnym razie wartość to 0.

Nie może być null.
ansi_nulls bit 1 = ustawienie ANSI_NULLS jest włączone dla żądania. W przeciwnym razie wartość to 0.

Nie może być null.
concat_null_yields_null bit 1 = ustawienie CONCAT_NULL_YIELDS_NULL jest włączone dla żądania. W przeciwnym razie wartość to 0.

Nie może być null.
transaction_isolation_level smallint Poziom izolacji, z którym jest tworzona transakcja dla tego żądania. Nie może być null.
0 = nieokreślony
1 = ReadUncommitted
2 = ReadCommitted
3 = powtarzalne
4 = Serializable
5 = Migawka
lock_timeout int Zablokuj limit czasu w milisekundach dla tego żądania. Nie może być null.
deadlock_priority int DEADLOCK_PRIORITY ustawienie dla żądania. Nie może być null.
row_count bigint Liczba wierszy zwróconych klientowi przez to żądanie. Nie może być null.
prev_error int Ostatni błąd, który wystąpił podczas wykonywania żądania. Nie może być null.
nest_level int Bieżący poziom zagnieżdżania kodu wykonywanego w żądaniu. Nie może być null.
granted_query_memory int Liczba stron przydzielonych do wykonania zapytania w żądaniu. Nie może być null.
executing_managed_code bit Wskazuje, czy określone żądanie aktualnie wykonuje obiekty środowiska uruchomieniowego języka wspólnego, takie jak procedury, typy i wyzwalacze. Jest on ustawiany dla pełnego czasu, w którym obiekt środowiska uruchomieniowego języka wspólnego znajduje się na stosie, nawet podczas uruchamiania Transact-SQL z poziomu środowiska uruchomieniowego języka wspólnego. Nie może być null.
group_id int Identyfikator grupy obciążeń, do której należy to zapytanie. Nie może być null.
query_hash binary(8) Wartość skrótu binarnego obliczana dla zapytania i używana do identyfikowania zapytań z podobną logiką. Możesz użyć skrótu zapytania, aby określić zagregowane użycie zasobów dla zapytań, które różnią się tylko wartościami literału.
query_plan_hash binary(8) Wartość skrótu binarnego obliczona na planie wykonywania zapytania i używana do identyfikowania podobnych planów wykonywania zapytań. Możesz użyć skrótu planu zapytania, aby znaleźć skumulowany koszt zapytań z podobnymi planami wykonywania.
statement_sql_handle varbinary(64) Dotyczy: SQL Server 2014 (12.x) i nowszych.

sql_handle pojedynczego zapytania.

Ta kolumna jest NULL taka, jeśli magazyn zapytań nie jest włączony dla bazy danych.
statement_context_id bigint Dotyczy: SQL Server 2014 (12.x) i nowszych.

Opcjonalny klucz obcy na sys.query_context_settings.

Ta kolumna jest NULL taka, jeśli magazyn zapytań nie jest włączony dla bazy danych.
dop int Dotyczy: SQL Server 2016 (13.x) i nowszych.

Stopień równoległości zapytania.
parallel_worker_count int Dotyczy: SQL Server 2016 (13.x) i nowszych.

Liczba zarezerwowanych równoległych procesów roboczych, jeśli jest to zapytanie równoległe.
external_script_request_id unikalnyidentyfikator Dotyczy: SQL Server 2016 (13.x) i nowszych.

Identyfikator żądania skryptu zewnętrznego skojarzony z bieżącym żądaniem.
is_resumable bit Dotyczy: SQL Server 2017 (14.x) i nowszych.

Wskazuje, czy żądanie jest operacją indeksu możliwego do wznowienia.
page_resource binary(8) Dotyczy: SQL Server 2019 (15.x)

Szesnastkowa reprezentacja zasobu strony szesnastkowa 8-bajtowa, jeśli kolumna wait_resource zawiera stronę. Aby uzyskać więcej informacji, zobacz sys.fn_PageResCracker.
page_server_reads bigint Dotyczy: Hiperskala usługi Azure SQL Database

Liczba odczytów serwera stron wykonywanych przez to żądanie. Nie może być null.
dist_statement_id unikalnyidentyfikator Dotyczy: SQL Server 2022 i nowsze wersje, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics (tylko pule bezserwerowe) i Microsoft Fabric

Unikatowy identyfikator instrukcji przesłanej żądania. Nie może być null.

Uwagi

Aby wykonać kod poza programem SQL Server (na przykład rozszerzonymi procedurami składowanymi i zapytaniami rozproszonymi), wątek musi być wykonywany poza kontrolą harmonogramu niewłaściwego. W tym celu proces roboczy przełącza się w tryb wyprzedzania. Wartości czasu zwracane przez ten dynamiczny widok zarządzania nie obejmują czasu spędzonego w trybie wyprzedzania.

Podczas wykonywania równoległych żądań w trybie wiersza program SQL Server przypisuje wątek procesu roboczego do koordynowania wątków roboczych odpowiedzialnych za wykonywanie przydzielonych zadań. W tym dynamicznym widoku zarządzania tylko wątek koordynatora jest widoczny dla żądania. Kolumny reads, writes, logical_readsi row_count nie są aktualizowane dla wątku koordynatora. Kolumny wait_type, , last_wait_typewait_time, wait_resourcei granted_query_memoryaktualizowane tylko dla wątku koordynatora. Aby uzyskać więcej informacji, zobacz przewodnik dotyczący architektury wątków i zadań .

Kolumna wait_resource zawiera podobne informacje do resource_description w sys.dm_tran_locks , ale jest formatowana inaczej.

Uprawnienia

Jeśli użytkownik ma VIEW SERVER STATE uprawnienia na serwerze, użytkownik widzi wszystkie wykonywane sesje w wystąpieniu programu SQL Server. W przeciwnym razie użytkownik widzi tylko bieżącą sesję. VIEW SERVER STATE Nie można udzielić w usłudze Azure SQL Database, więc sys.dm_exec_requests zawsze jest ograniczona do bieżącego połączenia.

W scenariuszach grupy dostępności, jeśli replika pomocnicza jest ustawiona na tylko intencję odczytu, połączenie z pomocniczym musi określić intencję aplikacji w parametrach połączenia przez dodanie elementu applicationintent=readonly. W przeciwnym razie sprawdzanie sys.dm_exec_requests dostępu dla baz danych w grupie dostępności nie jest przekazywane, nawet jeśli VIEW SERVER STATE uprawnienie jest obecne.

W przypadku programu SQL Server 2022 (16.x) i nowszych wersji sys.dm_exec_requests wymagane jest uprawnienie WYŚWIETL STAN WYDAJNOŚCI SERWERA na serwerze.

Przykłady

Odp. Znajdowanie tekstu zapytania dla uruchomionej partii

Poniższe przykładowe zapytania sys.dm_exec_requests , aby znaleźć interesujące zapytanie i skopiować je sql_handle z danych wyjściowych.

SELECT * FROM sys.dm_exec_requests;
GO

Następnie, aby uzyskać tekst instrukcji, użyj skopiowanego sql_handle z funkcją systemową sys.dm_exec_sql_text(sql_handle).

SELECT * FROM sys.dm_exec_sql_text(< copied sql_handle >);
GO

B. Pokaż aktywne żądania

W poniższym przykładzie pokazano wszystkie aktualnie uruchomione zapytania w magazynie danych programu SQL Server, z wyłączeniem własnej sesji (@@SPID). Używa polecenia CROSS APPLY z poleceniem sys.dm_exec_sql_text , aby pobrać pełny tekst zapytania dla każdego żądania i łączy się z elementem sys.dm_exec_sessions w celu uwzględnienia informacji o hoście użytkownika. Filtr session_id <> @@SPID gwarantuje, że nie widzisz własnego zapytania w wynikach.

SELECT r.session_id,
       r.status,
       r.command,
       r.start_time,
       r.total_elapsed_time / 1000.00 AS elapsed_seconds,
       r.cpu_time / 1000.00 AS cpu_seconds,
       r.reads,
       r.writes,
       r.logical_reads,
       r.row_count,
       s.login_name,
       s.host_name,
       t.text AS query_text
FROM sys.dm_exec_requests AS r
     INNER JOIN sys.dm_exec_sessions AS s
         ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
WHERE r.session_id <> @@SPID
ORDER BY r.start_time DESC;

C. Znajdź wszystkie blokady, w których jest przechowywana uruchomiona partia

Poniższe przykładowe zapytania sys.dm_exec_requests w celu znalezienia interesującej partii i skopiowania jej transaction_id z danych wyjściowych.

SELECT * FROM sys.dm_exec_requests;
GO

Następnie, aby znaleźć informacje o blokadzie, użyj skopiowanego transaction_id z funkcją sys.dm_tran_lockssystemową .

SELECT * FROM sys.dm_tran_locks
WHERE request_owner_type = N'TRANSACTION'
    AND request_owner_id = < copied transaction_id >;
GO

D. Znajdowanie wszystkich aktualnie zablokowanych żądań

Poniższe przykładowe zapytania sys.dm_exec_requests dotyczące znajdowania informacji o zablokowanych żądaniach.

SELECT session_id,
       status,
       blocking_session_id,
       wait_type,
       wait_time,
       wait_resource,
       transaction_id
FROM sys.dm_exec_requests
WHERE status = N'suspended';
GO

E. Zamawianie istniejących żądań według procesora CPU

SELECT [req].[session_id],
    [req].[start_time],
    [req].[cpu_time] AS [cpu_time_ms],
    OBJECT_NAME([ST].[objectid], [ST].[dbid]) AS [ObjectName],
    SUBSTRING(
        REPLACE(
            REPLACE(
                SUBSTRING(
                    [ST].[text], ([req].[statement_start_offset] / 2) + 1,
                    ((CASE [req].[statement_end_offset]
                            WHEN -1 THEN DATALENGTH([ST].[text])
                            ELSE [req].[statement_end_offset]
                        END - [req].[statement_start_offset]
                        ) / 2
                    ) + 1
                ), CHAR(10), ' '
            ), CHAR(13), ' '
        ), 1, 512
    ) AS [statement_text]
FROM
    [sys].[dm_exec_requests] AS [req]
    CROSS APPLY [sys].dm_exec_sql_text([req].[sql_handle]) AS [ST]
ORDER BY
    [req].[cpu_time] DESC;
GO