Sql-Server

為什麼只有少數 SQL Server 擴展事件計劃句柄 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

  • August 19, 2022

我們創建了一個擴展事件來擷取長時間執行的查詢,目標是通過加入計劃句柄列來獲取執行計劃,一些事件數據有一個帶有 id 值的計劃句柄,但是有些只有“00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000”並且無法根據這個零獲取執行計劃並產生Null。

這是 1 個範例,請指導這裡有什麼問題以及如何檢索此類計劃句柄的執行計劃?

非常感謝您的時間。

<event name="sql_batch_completed" package="sqlserver" timestamp="2022-08-19T16:13:10.711Z">
 <data name="cpu_time">
   <value>34797000</value>
 </data>
 <data name="duration">
   <value>42259048</value>
 </data>
 <data name="physical_reads">
   <value>640</value>
 </data>
 <data name="logical_reads">
   <value>17204111</value>
 </data>
 <data name="writes">
   <value>79477</value>
 </data>
 <data name="row_count">
   <value>8180</value>
 </data>
 <data name="result">
   <value>0</value>
   <text>OK</text>
 </data>
 <data name="batch_text">
   <value>select  SYSDATETIMEOFFSET() AS [Current_System_DateTime_Offset],  event_data,  
 DATEADD(SS, DATEDIFF(SS, GETUTCDATE(), CURRENT_TIMESTAMP), CONVERT(XML, event_Data).value('(event/@timestamp)[1]', 'datetime2')) AS [ServerDateTime] 
  , (select top 1 query_plan from sys.dm_exec_query_plan(CONVERT(VARBINARY(64), '0x' + 
  CAST((CONVERT(XML, event_Data).value(N'(event/action[@name="plan_handle"]/value)[1]', N'nvarchar(max)'))  AS varchar(4000)),1))) Query_plan  ,
  CONVERT(XML, event_Data).value(N'(event/action[@name="plan_handle"]/value)[1]', N'nvarchar(max)') plan_handle
  
FROM sys.fn_xe_file_target_read_file('C:\folder1\long_queries_long_queries_36c0ad49cf4e462fb7419312d0*xel', NULL, NULL, NULL) 
where  DATEADD(SS, DATEDIFF(SS, GETUTCDATE(), CURRENT_TIMESTAMP), CONVERT(XML, event_Data).value('(event/@timestamp)[1]', 'datetime2')) >  '2022-08-18 17:45:11.3280000'
 order by DATEADD(SS, DATEDIFF(SS, GETUTCDATE(), CURRENT_TIMESTAMP), CONVERT(XML, event_Data).value('(event/@timestamp)[1]', 'datetime2')) desc</value>
 </data>
 <action name="collect_system_time" package="package0">
   <value>2022-08-19T16:13:10.711Z</value>
 </action>
 <action name="client_app_name" package="sqlserver">
   <value>Microsoft SQL Server Management Studio - Query</value>
 </action>
 <action name="client_hostname" package="sqlserver">
   <value>CHANDAN-PC</value>
 </action>
 <action name="database_name" package="sqlserver">
   <value>SQLPlanner</value>
 </action>
 <action name="plan_handle" package="sqlserver">
   <value>0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</value>
 </action>
 <action name="session_id" package="sqlserver">
   <value>53</value>
 </action>
 <action name="session_nt_username" package="sqlserver">
   <value>CHANDAN-PC\Chandan Kumar</value>
 </action>
 <action name="sql_text" package="sqlserver">
   <value>select  SYSDATETIMEOFFSET() AS [Current_System_DateTime_Offset],  event_data,  
 DATEADD(SS, DATEDIFF(SS, GETUTCDATE(), CURRENT_TIMESTAMP), CONVERT(XML, event_Data).value('(event/@timestamp)[1]', 'datetime2')) AS [ServerDateTime] 
  , (select top 1 query_plan from sys.dm_exec_query_plan(CONVERT(VARBINARY(64), '0x' + 
  CAST((CONVERT(XML, event_Data).value(N'(event/action[@name="plan_handle"]/value)[1]', N'nvarchar(max)'))  AS varchar(4000)),1))) Query_plan  ,
  CONVERT(XML, event_Data).value(N'(event/action[@name="plan_handle"]/value)[1]', N'nvarchar(max)') plan_handle
  
FROM sys.fn_xe_file_target_read_file('C:\folder1\long_queries_36c0ad49cf4e462fb7419312d0*xel', NULL, NULL, NULL) 
where  DATEADD(SS, DATEDIFF(SS, GETUTCDATE(), CURRENT_TIMESTAMP), CONVERT(XML, event_Data).value('(event/@timestamp)[1]', 'datetime2')) >  '2022-08-18 17:45:11.3280000'
 order by DATEADD(SS, DATEDIFF(SS, GETUTCDATE(), CURRENT_TIMESTAMP), CONVERT(XML, event_Data).value('(event/@timestamp)[1]', 'datetime2')) desc</value>
 </action>
 <action name="transaction_id" package="sqlserver">
   <value>0</value>
 </action>
 <action name="transaction_sequence" package="sqlserver">
   <value>0</value>
 </action>
 <action name="username" package="sqlserver">
   <value>CHANDAN-PC\Chandan Kumar</value>
 </action>
</event>

OP 有sql_batch_completed作為事件和一個添加的 Action 來收集計劃句柄:

<event name="sql_batch_completed" package="sqlserver" [...]

<action name="plan_handle" package="sqlserver">

可以執行操作,但這並不意味著它們會產生任何有用的東西。在這種情況下,批處理沒有執行計劃(單個語句批處理可以,但這不是語義)。

例如,我可以為可用性組創建一個關於租約到期的會話並添加一個操作來獲取計劃句柄,但是沒有計劃句柄,仍然會發生操作並且不會收集任何有意義的數據。

CREATE EVENT SESSION [Unhelpful] ON SERVER 
ADD EVENT sqlserver.availability_group_lease_expired(
   ACTION(sqlserver.plan_handle))

您需要監控各個語句,因為它們將有一個與之關聯的計劃……但這也會給系統帶來很大的成本。

在大多數情況下,您嘗試做的事情已經通過查詢儲存或 QD S 為您完成。利用這將比 XE 更有益且成本更少。

引用自:https://dba.stackexchange.com/questions/315834