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.
- 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
- 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
- Cree un monitor de eventos de actividad para registrar información detallada de la actividad:
CREATE EVENT MONITOR ACTIVITIES
FOR ACTIVITIES
WRITE TO TABLE
- Habilita los nuevos monitores de eventos:
SET EVENT MONITOR ACTIVITIES STATE 1
SET EVENT MONITOR STMT_THRESH_VIOLATIONS STATE 1
- 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.
- 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.
- 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
- 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 ).