適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
SQL Server 資料庫引擎可讓您存取查詢執行計劃的執行階段資訊。 發生效能問題時最重要的動作之一,是準確地了解正在執行的工作負載以及衍生資源使用量的方式。 因此,存取 實際執行計劃 很重要。
儘管完成查詢是取得實際查詢計畫可用性的必要條件,當資料從查詢計畫運算子流到另一個運算子時,即時查詢統計資料可以提供查詢執行程序的即時深入解析。 即時查詢計畫會顯示整體的查詢進度,以及運算子層級的執行階段執行統計資料,如產生的資料列數目、耗用時間、運算子進度等等。因為此資料會即時提供,不需等待查詢完成,所以,這些執行統計資料在偵錯查詢效能問題方面非常有用,例如,長時間執行查詢,以及無限期執行且永遠不會完成的查詢。
標準查詢執行統計資料分析基礎結構
必須啟用 查詢執行統計資料設定檔基礎結構或標準分析,才能收集執行計劃的相關資訊,即資料列計數、CPU 和 I/O 使用量。 下列收集 目標工作階段 執行計劃資訊的方法會使用標準分析基礎架構:
Note
選取 [在 SQL Server Management Studio 中 包含即時查詢統計資料] 按鈕會使用標準分析基礎結構。 在較新版本的 SQL Server 中,如果已啟用 輕量型分析基礎結構 ,則在透過 活動監視器 檢視或直接查詢 sys.dm_exec_query_profiles DMV 時,會由即時查詢統計資料使用,而不是標準分析。
下列全域收集 所有階段作業 執行計劃資訊的方法會使用標準分析基礎架構:
- 擴展事件
query_post_execution_showplan。 若要啟用擴充事件,請參閱 使用擴充事件監視系統活動。 - SQL 追蹤和 SQL Server Profiler 中的 Showplan XML 追蹤事件。 如需此追蹤事件的詳細資訊,請參閱 Showplan XML 事件類別。
執行使用 query_post_execution_showplan 事件的擴充事件會話時,也會填入 sys.dm_exec_query_profiles DMV,這會使用 活動監視器 或直接查詢 DMV,啟用所有會話的即時查詢統計資料。 如需相關資訊,請參閱 Live Query Statistics。
輕量型查詢執行統計資料分析基礎結構
從 SQL Server 2014 (12.x) SP2 與 SQL Server 2016 (13.x) 開始,引進了新的輕量型查詢執行統計資料分析基礎結構 (或輕量型分析)。
Note
輕量型分析不支援原生編譯的預存程序。
輕量型查詢執行統計資料分析基礎結構 v1
適用於:SQL Server 2014 (12.x) SP2 到 SQL Server 2016 (13.x)。
從 SQL Server 2014 (12.x) SP2 與 SQL Server 2016 (13.x) 開始,已藉由引進輕量型分析來降低收集執行計畫相關資訊的效能額外負荷。 與標準分析不同,輕量型分析不會收集 CPU 執行階段資訊。 不過,輕量化剖析仍會收集資料列計數和 I/O 使用資訊。
也引進了使用 query_thread_profile 輕量型分析的新延伸事件。 此擴充事件會公開每個運算子執行統計資料,以便更深入了解每個節點和執行緒的效能。 使用此擴充事件的範例工作階段可以設定,如下列範例所示:
CREATE EVENT SESSION [NodePerfStats] ON SERVER
ADD EVENT sqlserver.query_thread_profile
(
ACTION (sqlos.scheduler_id,
sqlserver.database_id,
sqlserver.is_system,
sqlserver.plan_handle,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.server_instance_name,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.sql_text)
)
ADD TARGET package0.ring_buffer (SET max_memory = (25600))
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
Note
如需查詢分析的效能額外負荷詳細資訊,請參閱部落格文章 Developers Choice:Query progress - anytime, anywhere (開發人員選擇:查詢進度 - 隨時隨地)。
執行使用事件的 query_thread_profile 擴充事件會話時,也會使用輕量型分析填入 sys.dm_exec_query_profiles DMV,這會使用 活動監視器 或直接查詢 DMV,啟用所有會話的即時查詢統計資料。
輕量型查詢執行統計資料分析基礎結構 v2
適用於:SQL Server 2016 (13.x) SP1 到 SQL Server 2017 (14.x)。
SQL Server 2016 (13.x) SP1 包含經修訂的輕量型分析,附加負擔最低。 您也可以針對先前 [套用對象] 中所述的版本使用追蹤旗標 7412 全域啟用輕量型分析。 已引進新的 DMF sys.dm_exec_query_statistics_xml,針對進行中的要求傳回查詢執行計畫。
從 SQL Server 2016 (13.x) SP2 CU3 和 SQL Server 2017 (14.x) CU11 開始,如果未全域啟用輕量型分析,則可以使用新的 USE HINT 查詢提示 引數 QUERY_PLAN_PROFILE ,針對任何工作階段在查詢層級啟用輕量型分析。 當包含此新提示的查詢完成時,也會輸出新的 query_plan_profile 延伸事件,提供類似於延伸事件的 query_post_execution_showplan 實際執行計劃 XML。
Note
query_plan_profile擴充事件也會使用輕量型分析,即使未使用查詢提示也一樣。
可以使用擴充事件的 query_plan_profile 範例工作階段,如下列範例所示:
CREATE EVENT SESSION [PerfStats_LWP_Plan] ON SERVER
ADD EVENT sqlserver.query_plan_profile
(
ACTION (sqlos.scheduler_id,
sqlserver.database_id,
sqlserver.is_system,
sqlserver.plan_handle,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.server_instance_name,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.sql_text)
)
ADD TARGET package0.ring_buffer (SET max_memory = (25600))
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
輕量型查詢執行統計資料分析基礎結構 v3
適用於:SQL Server 2019 (15.x) 和更新版本,以及 Azure SQL 資料庫
SQL Server 2019 (15.x) 與 Azure SQL Database 包含最新修訂的輕量型分析版本,可收集所有執行的資料列計數資訊。 輕量型分析預設會在 SQL Server 2019 (15.x) 與 Azure SQL Database 啟用。 在 SQL Server 2019 (15.x) 和更新版本中,追蹤旗標 7412 沒有作用。 您可以使用LIGHTWEIGHT_QUERY_PROFILING,在資料庫層級停用輕量型分析: ALTER DATABASE SCOPED CONFIGURATION SET LIGHTWEIGHT_QUERY_PROFILING = OFF;。
現已引進新的 DMF sys.dm_exec_query_plan_stats,它在大多數查詢中會傳回最後一個已知實際執行計畫的對等項目,稱為「最後一個執行計畫統計資料」。 可以使用LAST_QUERY_PLAN_STATS,在資料庫層次啟用最後一個查詢計劃統計資料: ALTER DATABASE SCOPED CONFIGURATION SET LAST_QUERY_PLAN_STATS = ON;。
新的 query_post_execution_plan_profile 延伸事件會收集相當於基於輕量型分析的實際執行計劃,這與 query_post_execution_showplan使用標準分析不同。 SQL Server 2017 (14.x) 也會從 CU14 開始提供此事件。 可以使用擴充事件的 query_post_execution_plan_profile 範例工作階段,如下列範例所示:
CREATE EVENT SESSION [PerfStats_LWP_All_Plans] ON SERVER
ADD EVENT sqlserver.query_post_execution_plan_profile
(
ACTION (sqlos.scheduler_id,
sqlserver.database_id,
sqlserver.is_system,
sqlserver.plan_handle,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.server_instance_name,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.sql_text)
)
ADD TARGET package0.ring_buffer (SET max_memory = (25600))
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
範例 1 - 使用標準剖析的擴展事件工作階段
CREATE EVENT SESSION [QueryPlanOld] ON SERVER
ADD EVENT sqlserver.query_post_execution_showplan
(
ACTION (sqlos.task_time,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.sql_text)
)
ADD TARGET package0.event_file
(
SET filename = N'C:\Temp\QueryPlanStd.xel'
)
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
範例 2 - 使用輕量型分析的擴充事件工作階段
CREATE EVENT SESSION [QueryPlanLWP] ON SERVER
ADD EVENT sqlserver.query_post_execution_plan_profile
(
ACTION (sqlos.task_time,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash_signed,
sqlserver.sql_text)
)
ADD TARGET package0.event_file
(
SET filename = N'C:\Temp\QueryPlanLWP.xel'
)
WITH
(
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
查詢剖析架構使用指引
下表總結了在全域層級或單一工作階段中啟用標準分析或輕量分析的動作。 也包括支援動作的最早版本。
| Scope | 標準分析 | 輕量型分析 |
|---|---|---|
| Global | 與 XE 的 query_post_execution_showplan 擴展活動會議;從 SQL Server 2012 (11.x) 開始 |
追蹤旗標 7412;從 SQL Server 2016(13.x)SP1 開始 |
| Global | SQL 追蹤和 SQL Server Profiler 與 Showplan XML 追蹤事件 |
與 XE 的 query_thread_profile 擴展活動會議;從 SQL Server 2014 (12.x) SP2 開始 |
| Global | N/A | 與 XE 的 query_post_execution_plan_profile 擴展活動會議;從 SQL Server 2017 (14.x) CU14 和 SQL Server 2019 (15.x) 開始 |
| Session | 使用 SET STATISTICS XML ON |
將查詢提示與 QUERY_PLAN_PROFILE XE 的 query_plan_profile 擴充事件會話一起使用;從 SQL Server 2016 (13.x) SP2 CU3 和 SQL Server 2017 (14.x) CU11 開始 |
| Session | 使用 SET STATISTICS PROFILE ON |
N/A |
| Session | 選取 SSMS 中的 [ 即時查詢統計資料] 按鈕;從 SQL Server 2014 (12.x) SP2 開始 | N/A |
Remarks
Important
由於執行參考 sys.dm_exec_query_statistics_xml 的監視預存程序時,可能會發生隨機存取違規,因此請確保在 SQL Server 2016 (13.x) 和 SQL Server 2017 (14.x) 中安裝這個補充套件 KB 4078596。
從輕量型分析 v2 及其低額外負荷開始,任何尚未受 CPU 限制的伺服器都可以 持續執行輕量型分析,並允許資料庫專業人員隨時利用任何執行中的執行,例如使用活動監視器或直接查詢 sys.dm_exec_query_profiles,並取得具有執行階段統計資料的查詢計劃。
如需查詢分析的效能額外負荷詳細資訊,請參閱部落格文章 Developers Choice:Query progress - anytime, anywhere (開發人員選擇:查詢進度 - 隨時隨地)。
使用輕量型分析的擴充事件會使用標準分析中的資訊,以防已啟用標準分析基礎結構。 例如,使用 query_post_execution_showplan 的擴充事件工作階段正在執行,此時又啟動了另一個使用 query_post_execution_plan_profile 的工作階段。 第二個階段作業仍使用來自標準分析的資訊。
Note
在 SQL Server 2017 (14.x) 上,輕量型分析預設為關閉,但在啟動相依 query_post_execution_plan_profile 的擴充事件追蹤時啟用,然後在追蹤停止時再次停用。 因此,如果以 query_post_execution_plan_profile 為基礎的擴充事件追蹤經常在 SQL Server 2017 (14.x) 的執行個體上啟動和停止,您應該在全域層級使用追蹤旗標 7412 啟用輕量型監控,以避免反覆啟用和停用所帶來的額外負擔。