示例:捕获与语句的执行相关的活动信息

如果发现某个语句的执行时间很长,那么可定义阈值以在超出该阈值时让活动事件监视器捕获有关该语句的执行的信息。 然后,可将语句执行信息与活动事件监视器收集的信息相关联来查看活动指标,它们可帮助您了解可能导致速度变慢的原因。

开始之前

在捕获活动信息之前,必须标识所讨论的语句;例如,用户或应用程序开发者可能抱怨特定语句的运行时间比预期长。或者,可使用程序包高速缓存事件监视器来标识运行时间较长的语句。

关于此任务

在此示例中,要调查的查询作为应用程序的一部分运行。查询如下所示:
SELECT DISTINCT PARTS_BIN FROM STOCK WHERE PART_NUMBER = ?
速度变慢的一个可能原因是数据分发不适宜。例如,如果 STOCK 表只有几行对应大部分部件号,但有几千行对应一个特定部件号,那么它会花较长时间来运行此 SELECT 语句。以下示例说明如何检索与先前查询相关联的活动针对参数标记(“?”)处理的实际值。

过程

要测试不适宜数据分发导致查询运行变慢的假设,可为所提到的语句创建阈值。然后,可使用阈值和活动事件监视器来捕获有关该特定语句的执行的信息。可通过此信息确定运行时间超过预期的查询处理的实际值。

  1. 为所讨论的语句创建阈值,指定该语句运行超过 10 秒时发生的阈值违例事件:
    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. 创建阈值事件监视器来记录阈值违例:
    CREATE EVENT MONITOR STMT_THRESH_VIOLATIONS 
      FOR THRESHOLD VIOLATIONS 
      WRITE TO TABLE
      AUTOSTART
    
  3. 创建活动事件监视器来记录详细活动信息:
    CREATE EVENT MONITOR ACTIVITIES 
       FOR ACTIVITIES 
       WRITE TO TABLE
    
  4. 启用新事件监视器:
    SET EVENT MONITOR ACTIVITIES STATE 1
    SET EVENT MONITOR STMT_THRESH_VIOLATIONS STATE 1
  5. 运行执行此语句的应用程序。如果发生阈值违例,那么阈值违例事件监视器 STMT_THRESH_VIOLATIONS 会记录有关阈值违例的信息;与阈值违例相关联的活动的信息由活动事件监视器 ACTIVITIES 记录。
  6. 要确定是否发生了阈值违例,请查询阈值事件监视器针对步骤 1 中定义的阈值 TH1 记录的违例次数。要执行此查询,请连接视图 SYSCAT.THRESHOLDS 与阈值事件监视器生成的包含阈值违例信息的表。此连接是必需的,因为阈值名称 TH1 包含在 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.
    在这种情况下,有一个阈值违例;步骤 1 中标识的语句的一次执行时间超过 10 秒。
  7. 检查您在 1 中标识的语句内的参数标记 (?) 所表示的数据(部件号)。
    在以下示例中,SELECT 语句从活动事件监视器生成的其中一个 ACTIVITYVALS 表中检索参数标记(由下面的 SQL 中的 STMT_VALUE_DATA 表示)的值:
    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';
    
    在先前示例中,SELECT 语句从活动事件监视器生成的某个表中检索参数标记 (STMT_VALUE_DATA) 的值。
    
    PARAM_MARKER_VALUE
    --------------------------------------------------------------------------------
    475299
  8. 既然您知道与长时间运行的语句相关联的 PART_NUMBER 的值,那么可检查 STOCK 表以了解表中是否存在任何与该部件号出现次数有关的因素可能导致查询时间变长。例如,包含 475299 作为 PART_NUBMER 的值的许多行(与其他部件号的行数相比)可能是查询运行时间变长的原因(如果遇到此值)。

变体:通过使用可执行标识来为语句定义阈值

在以上示例中,该阈值在步骤 1 中通过使用该语句的实际文本显式标识。还可间接定义阈值,以标识程序包高速缓存中包含的语句的可执行标识。例如,可按如下所示定义阈值:
CREATE THRESHOLD TH1
   FOR STATEMENT REFERENCE 
     x'0100000000000000020000000000000000000000020020100304162158584850' ACTIVITIES
   ENFORCEMENT DATABASE
   WHEN ACTIVITYTOTALTIME > 10 SECONDS 
   COLLECT ACTIVITY DATA WITH DETAILS, SECTION AND VALUES
   CONTINUE;
在此示例中,跟在关键字 STATEMENT REFERENCE 后面的可执行标识用于在程序包高速缓存中查询相应语句文本。可通过检查程序包高速缓存来确定语句的可执行标识。有关如何查看程序包高速缓存中包含的信息的更多信息(包括语句的可执行标识),请参阅使用程序包高速缓存信息确定用于进行性能调整的候选语句

如果在程序包高速缓存中发现可执行标识,那么会从程序包高速缓存中检索关联语句文本,并且此文本用于定义语句阈值。对于静态 SQL 片段中的语句,如果该可执行标识不在程序包高速缓存中,那么会从系统目录中检索语句文本。对于动态 SQL 片段中的语句,考虑使用 PREPARE 语句以通过语句字符串创建预编译语句。如果在程序包高速缓存或系统目录中找不到该可执行标识,那么会返回错误 (SQL4721N)。