CREATE DIAGNOSTICS SESSION (Transact-SQL)

适用于:Analytics Platform System (PDW)

诊断会话允许保存有关系统或查询性能的详细用户定义的诊断信息。

诊断会话通常用于调试特定查询的性能,或在设备操作期间监视特定设备组件的行为。

注释

你应该熟悉 XML 才能使用诊断会话。

Syntax

-- Creating a new diagnostics session:
CREATE DIAGNOSTICS SESSION diagnostics_name AS N' { <session_xml> } ';

<session_xml>::
<Session>
   [ <MaxItemCount>max_item_count_num</MaxItemCount> ]
   [ <Filter>
      { <Event Name = "event_name"/>
         [ <Where><filter_property_name Name = "value" ComparisonType = "comp_type"/></Where> ] [ , ...n ]
      } [ , ...n ]
   </Filter> ]
   <Capture>
      <Property Name = "property_name"/> [ , ...n ]
   </Capture>
<Session>

-- Retrieving results for a diagnostics session:
SELECT * FROM master.sysdiag.diagnostics_name ;

-- Removing results for a diagnostics session:
DROP DIAGNOSTICS SESSION diagnostics_name ;

论点

diagnostics_name

诊断会话的名称。 诊断会话名称只能包含 a-z、A-Z 和 0-9 字符。 此外,诊断会话名称必须以字符开头。 diagnostics_name 限制为 127 个字符。

max_item_count_num

要保留在视图中的事件数。 例如,如果指定了 100,则与筛选条件匹配的 100 个最新事件将保存到诊断会话。 如果找到的匹配事件少于 100 个,则诊断会话包含的事件数少于 100 个。 max_item_count_num 必须至少为 100 且小于或等于 100,000。

event_name

定义要在诊断会话中收集的实际事件。 event_name是其中sys.pdw_diag_eventssys.pdw_diag_events.is_enabled='True'中列出的事件之一。

filter_property_name

要对其限制结果的属性的名称。 例如,如果要根据会话 ID 进行限制, filter_property_name 应为 SessionId。 有关filter_property_name的潜在值列表,请参阅property_name参数。

价值

要针对 filter_property_name计算的值。 值类型必须与属性类型匹配。 例如,如果属性类型为十进制,则 值 的类型必须为十进制。

comp_type

比较类型。 潜在值为:Equals、、、EqualsOrGreaterThan、GreaterThanEqualsOrLessThan、LessThan、 NotEqualsContains和RegEx。

property_name

与事件相关的属性。 属性名称可以是捕获标记的一部分,也可以用作筛选条件的一部分。

属性名称 Description
UserName 用户(登录名)名称。
SessionId 会话 ID。
QueryId 查询 ID。
CommandType 命令类型。
CommandText 已处理的命令中的文本。
OperationType 事件的操作类型。
Duration 事件的持续时间。
SPID 会话 ID。

Remarks

每个用户最多允许 10 个并发诊断会话。 有关当前会话的列表,请参阅sys.pdw_diag_sessions,并使用 <a0/&sys.pdw_diag_sessions 删除任何不需要的会话。

诊断会话将继续收集元数据,直到删除。

Permissions

需要 ALTER SERVER STATE 权限。

锁定

在诊断会话表上获取共享锁。

Examples

A. 创建诊断会话

此示例创建诊断会话来记录数据库引擎性能的指标。 该示例创建一个诊断会话,用于侦听引擎查询运行/结束事件和阻止 DMS 事件。 返回的内容是命令文本、计算机名称、请求 ID(查询 ID)和创建事件的会话。

CREATE DIAGNOSTICS SESSION MYDIAGSESSION AS N'
<Session>
   <MaxItemCount>100</MaxItemCount>
   <Filter>
      <Event Name="EngineInstrumentation:EngineQueryRunningEvent" />
      <Event Name="DmsCoreInstrumentation:DmsBlockingQueueEnqueueBeginEvent" />
      <Where>
         <SessionId Value="381" ComparisonType="NotEquals" />
      </Where>
   </Filter>
   <Capture>
      <Property Name="Query.CommandText" />
      <Property Name="MachineName" />
      <Property Name="Query.QueryId" />
      <Property Name="Alias" />
      <Property Name="Duration" />
      <Property Name="Session.SessionId" />
   </Capture>
</Session>';

创建诊断会话后,运行查询。

SELECT COUNT(EmployeeKey)
FROM AdventureWorksPDW2012..FactSalesQuota;

然后,通过从 sysdiag 架构中进行选择来查看诊断会话结果。

SELECT * FROM master.sysdiag.MYDIAGSESSION;

sysdiag 架构包含名为诊断会话名称的视图。

若要仅查看连接的活动,请添加 Session.SPID 属性并添加到 WHERE [Session.SPID] = @@spid; 查询。

完成诊断会话后,使用 DROP DIAGNOSTICS 命令将其删除。

DROP DIAGNOSTICS SESSION MYDIAGSESSION;

B. 备用诊断会话

具有略有不同属性的第二个示例。

-- Determine the session_id of your current session
SELECT TOP 1 session_id();

-- Replace <session_number> in the code below with the numbers in your session_id
CREATE DIAGNOSTICS SESSION PdwOptimizationDiagnostics AS N'
<Session>
   <MaxItemCount>100</MaxItemCount>
   <Filter>
      <Event Name="EngineInstrumentation:MemoGenerationBeginEvent" />
      <Event Name="EngineInstrumentation:MemoGenerationEndEvent" />
      <Event Name="DSQLInstrumentation:OptimizationBeginEvent" />
      <Event Name="DSQLInstrumentation:OptimizationEndEvent" />
      <Event Name="DSQLInstrumentation:BuildRelOpContextTreeBeginEvent" />
      <Event Name="DSQLInstrumentation:PostPlanGenModifiersEndEvent" />
      <Where>
         <SessionId Value="<session_number>" ComparisonType="Equals" />
      </Where>
   </Filter>
   <Capture>
      <Property Name="Session.SessionId" />
      <Property Name="Query.QueryId" />
      <Property Name="Query.CommandText" />
      <Property Name="Name" />
      <Property Name="DateTimePublished" />
      <Property Name="DateTimePublished.Ticks" />
  </Capture>
</Session>';

运行查询,例如:

USE ssawPDW;
GO

SELECT * FROM dbo.FactFinance;

以下查询返回授权计时:

SELECT *
FROM master.sysdiag.PdwOptimizationDiagnostics
ORDER BY DateTimePublished;

完成诊断会话后,使用 DROP DIAGNOSTICS 命令将其删除。

DROP DIAGNOSTICS SESSION PdwOptimizationDiagnostics;