Ejemplo: Captura de información de actividad relacionada con la ejecución de una sentencia

Si identificas una sentencia que está tardando mucho en ejecutarse, puedes definir un umbral que haga que un monitor de eventos de actividad capture información sobre la ejecución de esa sentencia cuando se supere el umbral. A continuación, puede correlacionar la información de ejecución de sentencias con la información recopilada por el monitor de eventos de actividad para ver las métricas de actividad que pueden ayudarle a comprender qué puede estar causando la ralentización.

Antes de empezar

Antes de capturar la información de actividad, debe identificar la sentencia en cuestión; por ejemplo, un usuario o desarrollador de aplicaciones puede quejarse de que una sentencia específica se ejecuta más de lo esperado. O bien, puede identificar una sentencia que está tardando más en ejecutarse utilizando el monitor de eventos de caché de paquetes.

Acerca de esta tarea

En este ejemplo, la consulta que se está investigando se ejecuta como parte de una aplicación. La consulta es la siguiente:
SELECT DISTINCT PARTS_BIN FROM STOCK WHERE PART_NUMBER = ?
Una posible razón de la ralentización podría ser una distribución desfavorable de los datos. Por ejemplo, si la tabla STOCK tiene sólo unas pocas filas para la mayoría de los números de pieza, pero tiene varios miles para un número de pieza en particular, se tarda más en ejecutar esta sentencia SELECT. El ejemplo siguiente muestra cómo recuperar los valores reales procesados para el marcador de parámetro ( ? ) por la actividad asociada a la consulta anterior.

Procedimiento

Para probar la hipótesis de que la distribución desfavorable de los datos es la causa de la lentitud de la consulta, puede crear un umbral para la sentencia en cuestión. A continuación, puede utilizar los monitores de umbrales y eventos de actividad para capturar información sobre la ejecución de esa sentencia concreta. A partir de esta información, puede determinar el valor real que fue procesado por la consulta que se ejecutó durante más tiempo del esperado.

  1. Cree un umbral para la sentencia en cuestión, especificando que se produce un evento de violación del umbral cuando la sentencia se ejecuta durante más de 10 segundos:
    CREATE THRESHOLD TH1
        FOR STATEMENT TEXT 'SELECT DISTINCT PARTS_BIN 
        FROM STOCK WHERE PART_NUMBER = ?' ACTIVITIES
        ENFORCEMENT DATABASE
        WHEN ACTIVITYTOTALTIME > 10 SECONDS 
        COLLECT ACTIVITY DATA WITH DETAILS, SECTION AND VALUES
        CONTINUE
  2. Crear un monitor de eventos de umbral para registrar las violaciones de umbral:
    CREATE EVENT MONITOR STMT_THRESH_VIOLATIONS 
      FOR THRESHOLD VIOLATIONS 
      WRITE TO TABLE
      AUTOSTART
    
  3. Cree un monitor de eventos de actividad para registrar información detallada de la actividad:
    CREATE EVENT MONITOR ACTIVITIES 
       FOR ACTIVITIES 
       WRITE TO TABLE
    
  4. Habilita los nuevos monitores de eventos:
    SET EVENT MONITOR ACTIVITIES STATE 1
    SET EVENT MONITOR STMT_THRESH_VIOLATIONS STATE 1
  5. Ejecute la aplicación que ejecuta la sentencia. Si se produce una violación del umbral, el monitor de eventos de violaciones del umbral STMT_THRESH_VIOLATIONS registra información sobre la violación del umbral; la información sobre la actividad asociada a la violación del umbral es registrada por el monitor de eventos de actividad ACTIVITIES.
  6. Para determinar si se ha producido una violación del umbral, consulte el número de violaciones registradas por el monitor de eventos de umbral para el umbral TH1 definido en el paso 1. Para realizar esta consulta, una la vista SYSCAT.THRESHOLDS con la tabla producida por el monitor de eventos de umbrales que contiene la información de violación de umbrales. Esta unión es necesaria porque el nombre del umbral TH1 se mantiene en SYSCAT.THRESHOLDS:
    SELECT COUNT(1) NUM_VIOLATIONS
            FROM THRESHOLDVIOLATIONS_DB2THRESHOLDVIOLATIONS T
            JOIN SYSCAT.THRESHOLDS S ON T.THRESHOLDID = S.THRESHOLDID
            WHERE S.THRESHOLDNAME = 'TH1';
    
    
    NUM_VIOLATIONS          
    --------------
              1
    
      1 record(s) selected.
    En este caso, hubo una violación del umbral; una ejecución de la sentencia identificada en el paso 1 se ejecutó durante más de 10 segundos.
  7. Examine los datos (el número de pieza) que representa el marcador de parámetro ( ? ) en el enunciado que ha identificado en 1.
    En el siguiente ejemplo, la sentencia SELECT recupera el valor del marcador de parámetro (representado por STMT_VALUE_DATA en el SQL que sigue) de una de las tablas ACTIVITYVALS que produce el monitor de eventos de actividad:
    SELECT SUBSTR(V.STMT_VALUE_DATA, 1, 80) PARAM_MARKER_VALUE
            FROM ACTIVITYVALS_ACTIVITIES V   
            JOIN THRESHOLDVIOLATIONS_STMT_THRESH_VIOLATIONS T
              ON T.APPL_ID = V.APPL_ID
              AND T.UOW_ID = V.UOW_ID
              AND T.ACTIVITY_ID = V.ACTIVITY_ID
            JOIN SYSCAT.THRESHOLDS S
              ON T.THRESHOLDID = S.THRESHOLDID
            WHERE S.THRESHOLDNAME = 'TH1';
    
    En el ejemplo anterior, la sentencia select recupera el valor del marcador de parámetro (STMT_VALUE_DATA) de una de las tablas producidas por el monitor de eventos de actividad.
    
    PARAM_MARKER_VALUE
    --------------------------------------------------------------------------------
    475299
  8. Ahora que conoce el valor de PART_NUMBER asociado con la sentencia de larga ejecución, puede examinar la tabla STOCK para ver si hay algo sobre las ocurrencias de ese número de parte en la tabla que pueda conducir a tiempos de consulta más largos. Por ejemplo, muchas filas que contienen 475299 como valor de PART_NUBMER (en comparación con el número de filas de otros números de pieza) podría ser una razón por la que la consulta se ejecuta más tiempo cuando se encuentra este valor.

Variación: Definición de un umbral para una sentencia mediante el ID del ejecutable

En el ejemplo anterior, el umbral se identifica en el paso 1 de forma explícita, utilizando el texto real de la declaración. También puede definir el umbral de forma indirecta, identificando el ID de ejecutable para una sentencia contenida en la caché de paquetes. Por ejemplo, puede definir el umbral de la siguiente manera:
CREATE THRESHOLD TH1
   FOR STATEMENT REFERENCE 
     x'0100000000000000020000000000000000000000020020100304162158584850' ACTIVITIES
   ENFORCEMENT DATABASE
   WHEN ACTIVITYTOTALTIME > 10 SECONDS 
   COLLECT ACTIVITY DATA WITH DETAILS, SECTION AND VALUES
   CONTINUE;
En este ejemplo, el ID del ejecutable que sigue a las palabras clave STATEMENT REFERENCE se utiliza para buscar el texto de la sentencia correspondiente en la caché del paquete. El ID ejecutable de una sentencia puede determinarse examinando la caché de paquetes. Para obtener más información sobre cómo ver la información contenida en la memoria caché del paquete, incluido el ID del ejecutable de una declaración, consulte Uso de la información de la memoria caché del paquete para identificar declaraciones que son candidatas para el ajuste del rendimiento.

Si el ID del ejecutable se encuentra en la caché de paquetes, el texto de la sentencia asociada se recupera de la caché de paquetes y se utiliza para definir el umbral de la sentencia. Para sentencias en secciones SQL estáticas, si el ID del ejecutable no está en la caché de paquetes, el texto de la sentencia se recupera de los catálogos del sistema. Para sentencias en secciones SQL dinámicas, considere el uso de la sentencia PREPARE para crear una sentencia preparada a partir de la cadena de sentencia. Si no se puede encontrar el ID del ejecutable en la caché de paquetes o en los catálogos del sistema, se devuelve un error SQL4721N ).