CREATE DIAGNOSTICS SESSION (Transact-SQL)

Se aplica:Analytics Platform System (PDW)

Las sesiones de diagnóstico le permiten guardar información de diagnóstico detallada y definida por el usuario sobre el rendimiento del sistema o de la consulta.

Las sesiones de diagnóstico se suelen usar para depurar el rendimiento de una consulta específica o para supervisar el comportamiento de un componente específico del dispositivo durante el funcionamiento del dispositivo.

Nota

Debe estar familiarizado con XML para usar las sesiones de diagnóstico.

Sintaxis

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

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

diagnostics_name
Nombre de la sesión de diagnóstico. Los nombres de sesión de diagnóstico pueden incluir únicamente los caracteres a-z, A-Z y 0-9. Además, los nombres de sesión de diagnóstico deben empezar por un carácter. diagnostics_name tiene un límite de 127 caracteres.

max_item_count_num
Número de eventos que van a conservarse en una vista. Por ejemplo, si se especifica 100, se conservarán en la sesión de diagnóstico los 100 eventos más recientes que cumplan los criterios del filtro. Si se detectan menos de 100 eventos coincidentes, la sesión de diagnóstico contendrá menos de 100 eventos. max_item_count_num debe ser como mínimo 100 y menor o igual que 100 000.

event_name
Define los eventos reales que se recopilan en la sesión de diagnóstico. event_name es uno de los eventos enumerados en sys.pdw_diag_events, donde sys.pdw_diag_events.is_enabled='True'.

filter_property_name
Nombre de la propiedad en la que se van a restringir los resultados. Por ejemplo, si quiere limitar en función del identificador de sesión, filter_property_name debe ser SessionId. Vea property_name más abajo para obtener una lista de posibles valores de filter_property_name.

value
Valor que se va a evaluar con respecto a filter_property_name. El tipo de valor debe coincidir con el tipo de propiedad. Por ejemplo, si el tipo de propiedad es decimal, el tipo de value debe ser decimal.

comp_type
Tipo de comparación. Los posibles valores son Equals, EqualsOrGreaterThan, EqualsOrLessThan, GreaterThan, LessThan, NotEquals, Contains y RegEx.

property_name
Propiedad relacionada con el evento. Los nombres de propiedad pueden formar parte de la etiqueta de captura o usarse como parte de los criterios de filtrado.

Nombre de propiedad Descripción
UserName Nombre de usuario (inicio de sesión).
SessionId Identificador de sesión.
QueryId Identificador de consulta.
CommandType Tipo de comando.
CommandText Texto dentro de un comando procesado.
OperationType Tipo de operación del evento.
Duration Duración del evento.
SPID Identificador de proceso del servicio.

Comentarios

Se permite para cada usuario un máximo de 10 sesiones de diagnóstico simultáneas. Vea sys.pdw_diag_sessions para obtener una lista de las sesiones actuales y anule las que ya no necesite mediante DROP DIAGNOSTICS SESSION.

Las sesiones de diagnóstico seguirán recopilando metadatos hasta que se anulen.

Permisos

Requiere el permiso ALTER SERVER STATE.

Bloqueo

Aplica un bloqueo compartido en la tabla de sesiones de diagnóstico.

Ejemplos

A. Creación de una sesión de diagnóstico

En este ejemplo se crea una sesión de diagnóstico para registrar las métricas del rendimiento del motor de base de datos. En el ejemplo se crea una sesión de diagnóstico que escucha los eventos de ejecución y finalización de la consulta del motor y un evento DMS de bloqueo. Lo que se devuelve es el texto del comando, el nombre del equipo, el identificador de la solicitud (identificador de consulta) y la sesión en la que se ha creado el evento.

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

Después de crear la sesión de diagnóstico, ejecute una consulta.

SELECT COUNT(EmployeeKey) FROM AdventureWorksPDW2012..FactSalesQuota;  

Después, vea los resultados de la sesión de diagnóstico. Para ello, selecciónela en el esquema sysdiag.

SELECT * FROM master.sysdiag.MYDIAGSESSION;  

Observe que el esquema sysdiag contiene una vista denominada con el nombre de la sesión de diagnóstico.

Para ver únicamente la actividad de la conexión, agregue la propiedad Session.SPID y agregue WHERE [Session.SPID] = @@spid; a la consulta.

Cuando haya terminado con la sesión de diagnóstico, anúlela con el comando DROP DIAGNOSTICS.

DROP DIAGNOSTICS SESSION MYDIAGSESSION;  

B. Sesión de diagnóstico alternativo

Un segundo ejemplo con propiedades ligeramente diferentes.

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

Ejecute una consulta, por ejemplo:

USE ssawPDW;  
GO  
SELECT * FROM dbo.FactFinance;  

La consulta siguiente devuelve el intervalo de autorización:

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

Cuando haya terminado con la sesión de diagnóstico, anúlela con el comando DROP DIAGNOSTICS.

DROP DIAGNOSTICS SESSION PdwOptimizationDiagnostics;