CREATE DIAGNOSTICS SESSION (Transact-SQL)

適用対象:Analytics Platform System (PDW)

診断セッションを使用すると、システムまたはクエリのパフォーマンスについての詳細なユーザー定義の診断情報を保存することができます。

診断セッションは通常、特定のクエリのパフォーマンスをデバッグする、またはアプライアンス操作中に特定のアプライアンス コンポーネントの動作を監視する場合に使用します。

Note

診断セッションを使用するために XML を熟知してください。

構文

-- 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 ;  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

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_events.is_enabled='True' の場合に sys.pdw_diag_events に列挙されるイベントの 1 つです。

filter_property_name
結果を制限するプロパティの名前です。 たとえば、セッション ID に基づいて制限する場合は、filter_property_nameSessionId にする必要があります。 filter_property_name に使用できる値の一覧については、以下の property_name を参照してください。

value
filter_property_name に対して評価する値。 値の型は、プロパティの型と一致する必要があります。 たとえば、プロパティの型が decimal の場合、value の型も decimal である必要があります。

comp_type
比較型。 可能性のある値: Equals、EqualsOrGreaterThan、EqualsOrLessThan、GreaterThan、LessThan、NotEquals、Contains、RegEx

property_name
イベントに関連するプロパティです。 プロパティ名は、キャプチャ タグの一部でもかまわず、またはフィルター条件の一部として使用されます。

プロパティ名 説明
UserName ユーザー (ログイン) の名前。
SessionId セッション ID。
QueryId クエリの ID。
CommandType コマンドの種類。
CommandText 処理されたコマンド内のテキスト。
OperationType イベントの操作の種類。
Duration イベントの期間。
SPID サービス プロセス ID。

解説

各ユーザーには、最大 10 個の同時診断セッションが許可されます。 現在のセッションの一覧については、sys.pdw_diag_sessions を参照してください。不要なセッションがある場合は、DROP DIAGNOSTICS SESSION を使用して削除します。

診断セッションでは、削除されるまでメタデータの収集が続行されます。

アクセス許可

ALTER SERVER STATE アクセス許可が必要です。

ロック

診断セッション テーブルで共有ロックを取得します。

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. 別の診断セッション

わずかに異なるプロパティを持つ 2 番目の例です。

-- 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;