sys.dm_exec_query_stats (Transact-SQL)
適用於:SQL Server
Azure SQL Database
Azure SQL 受控執行個體
傳回SQL Server中快取查詢計劃的匯總效能統計資料。 在此檢視中,快取計畫內的每個查詢陳述式各包含一個資料列,而資料列的存留期取決於計畫本身。 從快取移除計畫時,對應的資料列也會從這個檢視中刪除。
注意
- sys.dm_exec_query_stats的結果可能會隨著每個執行而有所不同,因為資料只會反映已完成的查詢,而不是仍在執行中的查詢。
- 若要從 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中的專用 SQL 集區呼叫此功能,請使用名稱sys.dm_pdw_nodes_exec_query_stats。 針對無伺服器 SQL 集區,請使用 sys.dm_exec_query_stats。
資料行名稱 | 資料類型 | 描述 |
---|---|---|
sql_handle | varbinary(64) | 這是指唯一識別所屬批次或預存程序的 Token。 sql_handle 再配合 statement_start_offset 和 statement_end_offset,可藉由呼叫 sys.dm_exec_sql_text 動態管理函數來擷取查詢的 SQL 文字。 |
statement_start_offset | int | 表示資料列於其批次或保存物件的文字中所描述之查詢的起始位置 (由 0 開始並以位元組為單位)。 |
statement_end_offset | int | 表示資料列於其批次或保存物件的文字中所描述之查詢的結束位置 (由 0 開始並以位元組為單位)。 對於 2014 SQL Server 2014 (12.x) 之前的版本,值為 -1 表示批次的結尾。 已不再包含尾端的註解。 |
plan_generation_num | bigint | 可用於重新編譯之後區分計畫執行個體的序號。 |
plan_handle | varbinary(64) | 這是一個權杖,可唯一識別已執行的批次查詢執行計畫,且其計畫位於計畫快取中,或目前正在執行中。 此值可以傳遞至 sys.dm_exec_query_plan 動態管理函數,以取得查詢計畫。 當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0x000。 |
creation_time | datetime | 計畫的編譯時間。 |
last_execution_time | datetime | 上次開始執行計畫的時間。 |
execution_count | bigint | 計畫從上次編譯以來被執行的次數。 |
total_worker_time | bigint | 這個計畫從編譯以來執行所耗用的 CPU 時間總量 (以毫秒為單位來報告,但是精確度只到毫秒)。 如果原生編譯預存程序執行數次的時間都少於 1 毫秒, total_worker_time 可能就不準確。 |
last_worker_time | bigint | 計畫上次執行所耗用的 CPU 時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 1 |
min_worker_time | bigint | 這個計畫在單次執行期間曾經耗用的最少 CPU 時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 1 |
max_worker_time | bigint | 這個計畫在單次執行期間曾經耗用的最多 CPU 時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 1 |
total_physical_reads | bigint | 這個計畫在編譯以來執行所執行的實體讀取總數。 查詢記憶體最佳化的資料表時一律為 0。 |
last_physical_reads | bigint | 計畫上次執行所執行的實體讀取數。 查詢記憶體最佳化的資料表時一律為 0。 |
min_physical_reads | bigint | 這個計畫在單次期間曾執行的最小實體讀取數。 查詢記憶體最佳化的資料表時一律為 0。 |
max_physical_reads | bigint | 這個計畫在單次執行期間曾執行的最大實體讀取數。 查詢記憶體最佳化的資料表時一律為 0。 |
total_logical_writes | bigint | 這個計畫在編譯以來執行所執行的邏輯寫入總數。 查詢記憶體最佳化的資料表時一律為 0。 |
last_logical_writes | bigint | 最近完成計畫執行期間所變更的緩衝集區頁面數目。 讀取頁面之後,頁面只會在第一次修改時變成已變更。 當頁面變成已變更時,這個數位會遞增。 已變更頁面的後續修改不會影響此號碼。 查詢記憶體優化資料表時,這個數位一律為 0。 |
min_logical_writes | bigint | 這個計畫在單次執行期間曾執行的最小邏輯寫入數。 查詢記憶體最佳化的資料表時一律為 0。 |
max_logical_writes | bigint | 這個計畫在單次執行期間曾執行的最大邏輯寫入數。 查詢記憶體最佳化的資料表時一律為 0。 |
total_logical_reads | bigint | 這個計畫在編譯以來執行所執行的邏輯讀取總數。 查詢記憶體最佳化的資料表時一律為 0。 |
last_logical_reads | bigint | 計畫上次執行所執行的邏輯讀取數。 查詢記憶體最佳化的資料表時一律為 0。 |
min_logical_reads | bigint | 這個計畫在單次執行期間曾執行的最小邏輯讀取數。 查詢記憶體最佳化的資料表時一律為 0。 |
max_logical_reads | bigint | 這個計畫在單次執行期間曾經執行的最大邏輯讀取數。 查詢記憶體最佳化的資料表時一律為 0。 |
total_clr_time | bigint | (以微秒回報的時間,但只有在 Microsoft .NET Framework Common Language Runtime (CLR) 物件執行之後,才會精確到毫秒) 。 CLR 物件可以是預存程序、函數、觸發程序、類型和彙總。 |
last_clr_time | bigint | 在上次執行此計畫期間,以微秒為單位報告的時間 (,但只有) 在 CLR 物件內執行期間,.NET Framework CLR 物件所耗用的毫秒。 CLR 物件可以是預存程序、函數、觸發程序、類型和彙總。 |
min_clr_time | bigint | 在單一執行期間,此計畫在 clR 物件內.NET Framework取用的時間下限 (,但只精確到毫秒) 。 CLR 物件可以是預存程序、函數、觸發程序、類型和彙總。 |
max_clr_time | bigint | 在單一執行期間,此計畫在.NET Framework CLR 內已耗用的最大時間 (,但只精確到毫秒) 。 CLR 物件可以是預存程序、函數、觸發程序、類型和彙總。 |
total_elapsed_time | bigint | 這個計畫完成執行經歷的總時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 |
last_elapsed_time | bigint | 這個計畫最近完成所經歷的時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 |
min_elapsed_time | bigint | 這個計畫的任何一次完成執行所經歷的最少時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 |
max_elapsed_time | bigint | 這個計畫的任何一次完成執行所經歷的最多時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 |
query_hash | 二進位 (8) | 針對查詢所計算的二進位雜湊值,可用來識別含有類似邏輯的查詢。 您可以使用查詢雜湊判別只有常值不同之查詢的彙總資源使用狀況。 |
query_plan_hash | binary (8) | 從查詢執行計畫計算所得的二進位雜湊值將用於識別類似的查詢執行計畫。 您可以使用查詢計劃雜湊尋找具有類似執行計畫之查詢的累計成本。 當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0x000。 |
total_rows | bigint | 查詢傳回的資料列總數。 不可以是 null。 當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0。 |
last_rows | bigint | 上次執行查詢時所傳回的資料列數目。 不可以是 null。 當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0。 |
min_rows | bigint | 查詢在一次執行期間傳回的資料列數目下限。 不可以是 null。 當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0。 |
max_rows | bigint | 查詢在一次執行期間傳回的資料列數目上限。 不可以是 null。 當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0。 |
statement_sql_handle | varbinary(64) | 適用於:SQL Server 2014 (12.x) 和更新版本。 只有在開啟查詢存放區並收集該特定查詢的統計資料時,才會填入非 Null 值。 |
statement_context_id | bigint | 適用於:SQL Server 2014 (12.x) 和更新版本。 只有在開啟查詢存放區並收集該特定查詢的統計資料時,才會填入非 Null 值。 |
total_dop | bigint | 此計畫編譯後所使用的平行處理原則程度總和。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
last_dop | bigint | 此計畫上次執行時的平行處理原則程度。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
min_dop | bigint | 此計畫在一次執行期間所使用的平行處理原則程度下限。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
max_dop | bigint | 此計畫在一次執行期間所使用的平行處理原則程度上限。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
total_grant_kb | bigint | 自編譯以來,此計畫收到的保留記憶體授與總數。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
last_grant_kb | bigint | 上次執行此計畫時,以 KB 為單位的保留記憶體授與數量。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
min_grant_kb | bigint | 此計畫在一次執行期間收到的最小保留記憶體授與數量。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
max_grant_kb | bigint | 此計畫在一次執行期間收到的保留記憶體授與數量上限。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
total_used_grant_kb | bigint | 自編譯後,此方案所使用之 KB 的保留記憶體授與總數。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
last_used_grant_kb | bigint | 上次執行此計畫時,以 KB 為單位的已使用記憶體授與量。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
min_used_grant_kb | bigint | 此計畫在一次執行期間所使用的記憶體授與數量下限。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
max_used_grant_kb | bigint | 此計畫在一次執行期間所使用的記憶體授與數量上限。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
total_ideal_grant_kb | bigint | 此計畫在 KB 中估計的理想記憶體授與總數,因為已編譯。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
last_ideal_grant_kb | bigint | 上次執行此計畫時,以 KB 為單位的理想記憶體授與量。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
min_ideal_grant_kb | bigint | 此計畫在一次執行期間預估的最小理想記憶體授與數量。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
max_ideal_grant_kb | bigint | 此計畫在一次執行期間預估的理想記憶體授與數量上限。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
total_reserved_threads | bigint | 此計畫自編譯以來所使用的保留平行線程總和。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
last_reserved_threads | bigint | 上次執行此計畫時保留的平行線程數目。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
min_reserved_threads | bigint | 此計畫在一次執行期間所使用的保留平行線程數目下限。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
max_reserved_threads | bigint | 此計畫在一次執行期間使用的最大保留平行線程數目。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
total_used_threads | bigint | 此計畫自編譯以來所使用的平行線程總和。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
last_used_threads | bigint | 上次執行此計畫時使用的平行線程數目。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
min_used_threads | bigint | 此計畫在一次執行期間所使用的平行線程數目下限。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
max_used_threads | bigint | 此計畫在一次執行期間使用的最大已使用平行線程數目。 查詢記憶體優化資料表一律為 0。 適用於:SQL Server 2016 (13.x) 和更新版本。 |
total_columnstore_segment_reads | bigint | 查詢所讀取的資料行存放區區段總和。 不可以是 null。 適用于:從 2016 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
last_columnstore_segment_reads | bigint | 上次執行查詢時所讀取的資料行存放區區段數目。 不可以是 null。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
min_columnstore_segment_reads | bigint | 查詢在一次執行期間讀取的資料行存放區區段數目下限。 不可以是 null。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
max_columnstore_segment_reads | bigint | 一次執行期間查詢所讀取的資料行存放區區段數目上限。 不可以是 null。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
total_columnstore_segment_skips | bigint | 查詢略過的資料行存放區區段總和。 不可以是 null。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
last_columnstore_segment_skips | bigint | 上次執行查詢時略過的資料行存放區區段數目。 不可以是 null。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
min_columnstore_segment_skips | bigint | 查詢在一次執行期間略過的資料行存放區區段數目下限。 不可以是 null。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
max_columnstore_segment_skips | bigint | 查詢在一次執行期間略過的資料行存放區區段數目上限。 不可以是 null。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
total_spills | bigint | 自從編譯此查詢之後,執行此查詢所溢出的頁面總數。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
last_spills | bigint | 上次執行查詢時溢出的頁數。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
min_spills | bigint | 此查詢在單一執行期間曾溢出的最小頁數。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
max_spills | bigint | 此查詢在單一執行期間曾溢出的頁數上限。 適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始 |
pdw_node_id | int | 這個散發所在的節點識別碼。 適用于:Azure Synapse Analytics、Analytics Platform System (PDW) |
total_page_server_reads | bigint | 此計畫編譯後執行所執行的遠端頁面伺服器讀取總數。 適用于:Azure SQL資料庫超大規模資料庫 |
last_page_server_reads | bigint | 上次執行計畫時執行的遠端頁面伺服器讀取數目。 適用于:Azure SQL資料庫超大規模資料庫 |
min_page_server_reads | bigint | 在單一執行期間,此計畫曾執行的遠端頁面伺服器讀取數目下限。 適用于:Azure SQL資料庫超大規模資料庫 |
max_page_server_reads | bigint | 在單一執行期間,此計畫曾執行的遠端頁面伺服器讀取數目上限。 適用于:Azure SQL資料庫超大規模資料庫 |
注意
1 針對啟用統計資料收集時原生編譯的預存程式,會以毫秒為單位收集背景工作時間。 如果查詢以小於 1 毫秒執行,此值會是 0。
權限
在 SQL Server 和 SQL 受控執行個體上,需要 VIEW SERVER STATE
權限。
在 SQL Database [Basic]、[S0] 和 [S1] 服務目標,以及彈性集區中的資料庫,需要伺服器管理員帳戶、Azure Active Directory 管理員帳戶或##MS_ServerStateReader##
伺服器角色的成員資格。 在所有其他 SQL Database 服務目標上,需要資料庫的 VIEW DATABASE STATE
權限或 ##MS_ServerStateReader##
伺服器角色的成員資格。
SQL Server 2022 及更新版本的權限
需要伺服器上的 VIEW SERVER PERFORMANCE STATE 權限。
備註
完成查詢時,會更新檢視中的統計資料。
範例
A. 尋找 TOP N 查詢
下列範例會傳回以平均 CPU 時間排名的前五個查詢的相關資訊。 這個範例會根據查詢雜湊彙總查詢,以便依據累計資源耗用量分組邏輯對等查詢。 Sample_Statement_Text資料行會顯示符合查詢雜湊的查詢結構範例,但應該讀取,而不需考慮語句中的特定值。 例如,如果語句包含 WHERE Id = 5
,您可能會以較泛型的形式加以讀取: WHERE Id = @some_value
SELECT TOP 5 query_stats.query_hash AS Query_Hash,
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS Avg_CPU_Time,
MIN(query_stats.statement_text) AS Sample_Statement_Text
FROM
(SELECT QS.*,
SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(ST.text)
ELSE QS.statement_end_offset END
- QS.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS QS
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
B. 傳回查詢的資料列計數彙總
下列範例會傳回查詢的資料列計數彙總資訊 (資料列總數、最小資料列數目、最大資料列數目及上次傳回的資料列數目)。
SELECT qs.execution_count,
SUBSTRING(qt.text,qs.statement_start_offset/2 +1,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), qt.text)) * 2
ELSE qs.statement_end_offset end -
qs.statement_start_offset
)/2
) AS query_text,
qt.dbid, dbname= DB_NAME (qt.dbid), qt.objectid,
qs.total_rows, qs.last_rows, qs.min_rows, qs.max_rows
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE qt.text like '%SELECT%'
ORDER BY qs.execution_count DESC;
另請參閱
執行相關的動態管理檢視和函數 (Transact-SQL)
sys.dm_exec_sql_text (Transact-SQL)
sys.dm_exec_query_plan (Transact-SQL)
sys.dm_exec_procedure_stats (Transact-SQL)
sys.dm_exec_trigger_stats (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)