sys.dm_exec_requests (Transact-SQL)

適用于:SQL ServerAzure SQL資料庫Azure SQL 受控執行個體Azure Synapse Analytics AnalyticsPlatform System (PDW)

傳回在 SQL Server 中執行之每項要求的相關資訊。 如需要求的詳細資訊,請參閱 執行緒和工作架構指南

注意

若要從 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中的專用 SQL 集區呼叫此功能,請參閱sys.dm_pdw_exec_requests (Transact-SQL) 。 針對無伺服器 SQL 集區,請使用 sys.dm_exec_requests

資料行名稱 資料類型 描述
session_id smallint 這個要求相關的工作階段識別碼。 不可為 Null。
request_id int 要求的識別碼。 在工作階段的內容中是唯一的。 不可為 Null。
start_time datetime 要求到達時的時間戳記。 不可為 Null。
status nvarchar(30) 要求的狀態。 可以是下列值之一:

背景
執行中
可執行的
休眠中
暫止

不可為 Null。
命令 nvarchar(32) 識別目前所處理命令的類型。 常見的命令類型包括下列值:

SELECT
INSERT
UPDATE
DELETE
BACKUP LOG
BACKUP DATABASE
DBCC
FOR

要求的文字可使用 sys.dm_exec_sql_text 加上要求的對應 sql_handle 來擷取。 內部系統處理序會根據其所執行工作的類型來設定命令。 工作可以包含下列值:

LOCK MONITOR
CHECKPOINTLAZY
WRITER

不可為 Null。
sql_handle varbinary(64) 這是可唯一識別查詢所屬批次或預存程式的權杖。 可為 Null。
statement_start_offset int 指出,以位元組為單位,從 0 開始,目前執行中批次或保存物件的目前執行語句開始位置。 可與 、 statement_end_offsetsys.dm_exec_sql_text 動態管理功能搭配 sql_handle 使用,以擷取要求的目前執行語句。 可為 Null。
statement_end_offset int 指出,以位元組為單位,從 0 開始,目前執行中批次或保存物件的目前執行語句結束位置。 可與 、 statement_start_offsetsys.dm_exec_sql_text 動態管理功能搭配 sql_handle 使用,以擷取要求的目前執行語句。 可為 Null。
plan_handle varbinary(64) 這是一個權杖,可唯一識別目前正在執行的批次查詢執行計畫。 可為 Null。
database_id smallint 要求執行目標的資料庫識別碼。 不可為 Null。
user_id int 提交要求之使用者的識別碼。 不可為 Null。
connection_id uniqueidentifier 要求到達所用連接的識別碼。 可為 Null。
blocking_session_id smallint 封鎖要求之工作階段的識別碼。 如果此資料行為 Null 或等於 0,則不會封鎖要求,或封鎖會話的會話資訊無法 (或無法識別) 。 如需詳細資訊,請參閱瞭解並解決SQL Server封鎖問題

-2 = 封鎖資源是由被遺棄的分散式交易所擁有。

-3 = 封鎖資源是由延遲的復原交易所擁有。

-4 = 封鎖閂鎖擁有者的會話識別碼目前無法判斷,因為內部閂鎖狀態轉換。

-5 = 無法判斷封鎖閂鎖擁有者的會話識別碼,因為無法追蹤此閂鎖類型 (例如 SH 閂鎖) 。

本身,blocking_session_id -5 不會指出效能問題。 -5 表示會話正在等候非同步動作完成。 在引進 -5 之前,相同的會話會顯示blocking_session_id 0,即使它仍處於等候狀態也一樣。

視工作負載而定,觀察到 -5,因為blocking_session_id可能是常見的情況。
wait_type nvarchar(60) 若要求目前被封鎖,這個資料行會傳回等候的類型。 可為 Null。

如需等候類型的相關資訊,請參閱 sys.dm_os_wait_stats (Transact-SQL)
wait_time int 若要求目前被封鎖,這個資料行會傳回目前等候的持續時間 (以毫秒為單位)。 不可為 Null。
last_wait_type nvarchar(60) 如果這個要求先前被封鎖,這個資料行會傳回上次等候的類型。 不可為 Null。
wait_resource nvarchar(256) 若要求目前被封鎖,這個資料行會傳回要求目前等候的資源。 不可為 Null。
open_transaction_count int 為這項要求開啟的交易數目。 不可為 Null。
open_resultset_count int 為這項要求開啟的結果集數目。 不可為 Null。
transaction_id bigint 這項要求執行所在交易的識別碼。 不可為 Null。
context_info varbinary(128) 工作階段的 CONTEXT_INFO 值。 可為 Null。
percent_complete real 下列命令已完成工作的百分比:

ALTER INDEX REORGANIZE
含有 ALTER DATABASE 的 AUTO_SHRINK 選項
BACKUP DATABASE
DBCC CHECKDB
DBCC CHECKFILEGROUP
DBCC CHECKTABLE
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
RECOVERY
RESTORE DATABASE
ROLLBACK
TDE ENCRYPTION

不可為 Null。
estimated_completion_time bigint 僅供內部使用。 不可為 Null。
cpu_time int 要求所用的 CPU 時間 (以毫秒為單位)。 不可為 Null。
total_elapsed_time int 要求到達後所經過的總時間 (以毫秒為單位)。 不可為 Null。
scheduler_id int 排程這項要求之排程器的識別碼。 可為 Null。
task_address varbinary(8) 配置給這項要求之關聯工作的記憶體位址。 可為 Null。
reads bigint 這項要求所執行的讀取數。 不可為 Null。
writes bigint 這項要求所執行的寫入數。 不可為 Null。
logical_reads bigint 這項要求所執行的邏輯讀取數。 不可為 Null。
text_size int 這項要求的 TEXTSIZE 設定。 不可為 Null。
語言 nvarchar(128) 這項要求的語言設定。 可為 Null。
date_format Nvarchar (3) 這項要求的 DATEFORMAT 設定。 可為 Null。
date_first smallint 這項要求的 DATEFIRST 設定。 不可為 Null。
quoted_identifier bit 1 = 這項要求的 QUOTED_IDENTIFIER 是 ON。 否則為 0。

不可為 Null。
arithabort bit 1 = 這項要求的 ARITHABORT 設定是 ON。 否則為 0。

不可為 Null。
ansi_null_dflt_on bit 1 = 這項要求的 ANSI_NULL_DFLT_ON 設定是 ON。 否則為 0。

不可為 Null。
ansi_defaults bit 1 = 這項要求的 ANSI_DEFAULTS 設定是 ON。 否則為 0。

不可為 Null。
ansi_warnings bit 1 = 這項要求的 ANSI_WARNINGS 設定是 ON。 否則為 0。

不可為 Null。
ansi_padding bit 1 = 這項要求的 ANSI_PADDING 設定是 ON。

否則為 0。

不可為 Null。
ansi_nulls bit 1 = 這項要求的 ANSI_NULLS 設定是 ON。 否則為 0。

不可為 Null。
concat_null_yields_null bit 1 = 這項要求的 CONCAT_NULL_YIELDS_NULL 設定是 ON。 否則為 0。

不可為 Null。
transaction_isolation_level smallint 建立這項要求之交易所用的隔離等級。 不可為 Null。
0 = Unspecified
1 = ReadUncomitted
2 = ReadCommitted
3 = Repeatable
4 = Serializable
5 = Snapshot
lock_timeout int 這項要求的鎖定逾時期限 (以毫秒為單位)。 不可為 Null。
deadlock_priority int 這項要求的 DEADLOCK_PRIORITY 設定。 不可為 Null。
row_count bigint 這項要求傳回用戶端的資料列數。 不可為 Null。
prev_error int 這項要求執行期間最後一次發生的錯誤。 不可為 Null。
nest_level int 這項要求所執行程式碼的目前巢狀層級。 不可為 Null。
granted_query_memory int 配置給這項要求之查詢執行的頁數。 不可為 Null。
executing_managed_code bit 指出特定要求目前是否正在執行 Common Language Runtime 物件 (如常式、類型和觸發程序)。 它已針對完整時間設定 Common Language Runtime 物件位於堆疊上,即使從 Common Language Runtime 內執行 Transact-SQL 也是如此。 不可為 Null。
group_id int 這個查詢所屬工作負載群組的識別碼。 不可為 Null。
query_hash binary (8) 針對查詢所計算的二進位雜湊值,可用來識別含有類似邏輯的查詢。 您可以使用查詢雜湊判別只有常值不同之查詢的彙總資源使用狀況。
query_plan_hash binary (8) 從查詢執行計畫計算所得的二進位雜湊值將用於識別類似的查詢執行計畫。 您可以使用查詢計劃雜湊尋找具有類似執行計畫之查詢的累計成本。
statement_sql_handle varbinary(64) 適用于:SQL Server 2014 (12.x) 和更新版本。

個別查詢的 SQL 控制碼。

如果資料庫未啟用查詢存放區,則此資料行為 Null。
statement_context_id bigint 適用于:SQL Server 2014 (12.x) 和更新版本。

要sys.query_coNtext_settings的選擇性外鍵。

如果資料庫未啟用查詢存放區,則此資料行為 Null。
dop int 適用于:SQL Server 2016 (13.x) 和更新版本。

查詢的平行處理原則程度。
parallel_worker_count int 適用于:SQL Server 2016 (13.x) 和更新版本。

如果這是平行查詢,則為保留的平行背景工作角色數目。
external_script_request_id uniqueidentifier 適用于:SQL Server 2016 (13.x) 和更新版本。

與目前要求相關聯的外部腳本要求識別碼。
is_resumable bit 適用于:SQL Server 2017 (14.x) 和更新版本。

指出要求是否為可繼續的索引作業。
page_resource binary (8) 適用于:SQL Server 2019 (15.x)

如果 wait_resource 資料行包含頁面,則為頁面資源的 8 位元組十六進位標記法。 如需詳細資訊,請參閱 sys.fn_PageResCracker
page_server_reads bigint 適用于:Azure SQL資料庫超大規模資料庫

此要求所執行的頁面伺服器讀取數目。 不可為 Null。

備註

若要執行SQL Server (外部的程式碼,例如,擴充預存程式和分散式查詢) ,執行緒必須在非先占式排程器的控制之外執行。 若要這麼做,工作者必須切換到先佔式模式。 此動態管理檢視所傳回的時間值不包含在先占模式中花費的時間。

資料列模式執行平行要求時,SQL Server指派背景工作執行緒來協調負責完成指派給他們的工作的背景工作執行緒。 在此 DMV 中,只有協調器執行緒會顯示要求。 協調器執行緒不會更新資料行 readswriteslogical_readsrow_count 。 協調器執行緒只會更新資料行 wait_typewait_timelast_wait_type 、、 wait_resourcegranted_query_memory 。 如需詳細資訊,請參閱執行緒與工作架構指南

權限

如果使用者具有 VIEW SERVER STATE 伺服器的許可權,使用者就會在SQL Server實例上看到所有執行中的會話;否則,使用者只會看到目前的會話。 VIEW SERVER STATE無法在 Azure SQL Database 中授與,因此 sys.dm_exec_requests 一律僅限於目前的連線。

在Always-On案例中,如果次要複本設定為 唯讀意圖,則與次要複本的連接必須在連接字串參數中藉由新增 applicationintent=readonly 來指定其應用程式意圖。 否則,即使 VIEW SERVER STATE 有許可權,存取檢查 sys.dm_exec_requests 也不會針對可用性群組中的資料庫傳遞。

SQL Server 2022 和更新版本的許可權

需要伺服器上的 VIEW SERVER PERFORMANCE STATE 許可權。

範例

A. 尋找執行中批次的查詢文字

下列範例會查詢 sys.dm_exec_requests 來尋找重要查詢並且從輸出複製其 sql_handle

SELECT * FROM sys.dm_exec_requests;  
GO  

然後,若要取得陳述式文字,請使用複製的 sql_handle 搭配系統函數 sys.dm_exec_sql_text(sql_handle)

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

B. 尋找執行中批次持有的所有鎖定

下列範例會查詢 sys.dm_exec_requests 以尋找有趣的批次,並從輸出複製它 transaction_id

SELECT * FROM sys.dm_exec_requests;  
GO

然後,若要尋找鎖定資訊,請使用與系統函 sys.dm_tran_locks 式 一 transaction_id 起複製的 。

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

C. 尋找所有目前封鎖的要求

下列範例會查詢 sys.dm_exec_requests 以尋找已封鎖要求的相關資訊。

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  

D. 依 CPU 排序現有要求

SELECT 
   req.session_id
   , req.start_time
   , cpu_time 'cpu_time_ms'
   , object_name(st.objectid,st.dbid) 'ObjectName' 
   , substring
      (REPLACE
        (REPLACE
          (SUBSTRING
            (ST.text
            , (req.statement_start_offset/2) + 1
            , (
               (CASE 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 cpu_time desc;
GO

另請參閱

後續步驟