SQL Server 數據庫引擎 提供了訪問查詢執行計劃的運行時信息的功能。 出現性能問題時,最重要的操做之一是準確瞭解正在執行的工做負載以及如何驅動使用資源。 爲此,訪問實際執行計劃是很重要的。sql
雖然查詢完成是實際查詢計劃可用性的先決條件,但實時查詢統計信息能夠提供對查詢執行過程的實時看法,由於數據是從一個查詢計劃運算符移動到另外一個。 實時查詢計劃顯示整體查詢進度和操做員級運行時執行統計信息(例如處理的行數、通過的時間、操做員進度等)。因爲此數據是實時可用的,無需等待完成查詢,所以這些執行統計信息對於調試查詢性能問題很是有用,例如長時間運行查詢以及無限期運行而從未完成過的查詢。數據庫
必須啓用查詢執行統計信息配置文件基礎結構或標準分析,以收集有關執行計劃的信息,即行數、CPU 和 I/O 使用狀況 。 如下收集目標會話的執行計劃信息的方法利用標準分析基礎結構:服務器
備註session
單擊 SQL Server Management Studio 中的「包含實時查詢統計信息」按鈕能夠利用標準分析基礎結構 。
在更高版本的 SQL Server 中,若是啓用了輕量級分析基礎結構,則在經過活動監視器查看或直接查詢 sys.dm_exec_query_profiles DMV 時經過實時查詢統計信息而非標準分析加以利用。sqlserver
如下爲全部會話全局收集執行計劃信息的方法利用標準分析基礎結構:post
當運行使用 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) 開始,引入了新的輕型查詢執行統計信息概要分析基礎結構或輕型分析 。spa
備註線程
本機編譯存儲過程不支持輕型分析。3d
適用對象:SQL Server(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);
備註
有關查詢分析的性能開銷的詳細信息,請參閱博客文章Developers Choice:Query progress - anytime, anywhere(開發人員之選:隨時隨地查詢進度)。
當運行使用 query_thread_profile 事件的擴展事件會話時,還會使用輕型分析填充 sys.dm_exec_query_profiles DMV,它使用活動監視器或直接查詢 DMV,爲全部會話啓用實時查詢統計。
適用對象:SQL Server(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。
備註
即便未使用查詢提示,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);
適用對象:SQL Server(從 SQL Server 2019(預覽版) 開始)
SQL Server 2019(預覽版) 包括一個新修訂的輕型分析版本,用於收集全部執行的行計數信息。 默認狀況下,SQL Server 2019(預覽版) 中已啓用輕型分析,跟蹤標誌 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 不一樣 。 能夠像以下所示對使用 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);
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);
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);
重要
因爲在執行引用 sys.dm_exec_query_statistics_xml 的監視存儲過程時可能存在隨機 AV,所以請確保在 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
的會話已啓動。第二個會話仍將使用來自標準分析的信息。