查看系统中耗用时间的位置

可以使用“耗用时间”监视元素来了解系统中耗用时间的位置。可以使用“耗用时间”监视元素来针对特定工作单元、服务子类、工作负载或连接进行报告。

关于此任务

一旦您检索用于报告系统中耗用时间的位置的各种监视元素,就可以采用多种方法来查看这些监视元素。在最基本的级别,可以将所报告的值作为列表来查看。您可能想使用值来创建一些比率,例如,锁定等待时间与总的请求时间之间的比率。您也可以使用检索到的值来创建图表,以帮助您将“耗用时间”监视元素相对于另一个监视元素进行可视化。
备注:
  • 这些查询的输出中所显示的值只是为了便于说明,不应将它们理解为表示您在自己的系统中可能看到的内容。
  • 此任务说明如何检索特定的“耗用时间”监视元素。还可以使用 V9.7 修订包 1 中引入的新的格式化函数来检索满足特定条件的“耗用时间”监视元素,例如,具有非零值的那些监视元素,在您指定的某一范围内的值的监视元素,或者最前面的 n 个监视元素(例如,前 5 个等待时间)。示例 4 说明了这些功能的工作方式。

过程

  1. 首先,确定您对哪些“耗用时间”元素感兴趣。
    例如,您可能希望查看与系统中的所有连接的总请求时间相比较的等待总时间。
  2. 明确阐明一个将使用其中一个监视器表函数的 SQL 查询,而此表函数将检索您感兴趣的元素。
    在此示例中,可以使用 MON_GET_CONNECTION 表函数来检索某个连接的 total_request_timetotal_wait_time 监视元素:
    SELECT APPLICATION_HANDLE,
           TOTAL_WAIT_TIME, 
           TOTAL_RQST_TIME 
    FROM TABLE(MON_GET_CONNECTION(NULL,NULL))
    上述查询将返回以下输出(所有时间都是按毫秒进行报告):
    APPLICATION_HANDLE   TOTAL_WAIT_TIME      TOTAL_RQST_TIME
    -------------------- -------------------- --------------------
                      39                  179                  269
                      78                    0                    0
                      51                  207                  316
                      77                    0                   21
                      50                 1014                 1408
                      40                  109                  351
                      79                   89                  167
    
      7 record(s) selected.
  3. 在此示例中有 7 个应用程序连接;可以使用第二列和第三列中的结果来确定等待每个应用程序所耗用时间所占的百分比。
    例如,对于应用程序 50,与总的请求时间相比,该应用程序所耗用的等待时间为 (1014 ÷ 1408) × 100 ≈ 72%。

示例

示例 1:确定所有连接中用于等待的时间相对于请求总时间的平均值。
此示例与前一个示例相似,只不过这次是通过 SQL 来计算等待时间百分比的平均值:
WITH PCTWAIT AS (
     SELECT SUM(TOTAL_WAIT_TIME)AS WAIT_TIME, 
            SUM(TOTAL_RQST_TIME)AS RQST_TIME 
     FROM TABLE(MON_GET_CONNECTION(NULL,NULL)) AS METRICS)
     SELECT WAIT_TIME,
            RQST_TIME,
     CASE WHEN RQST_TIME > 0 
     THEN DEC((FLOAT(WAIT_TIME))/FLOAT(RQST_TIME) * 100,5,2) 
     ELSE NULL END AS WAIT_PCT FROM PCTWAIT
运行上述查询的结果将类似于以下内容:
WAIT_TIME            RQST_TIME            WAIT_PCT
-------------------- -------------------- --------
                1515                 2439    62.11

  1 record(s) selected.
示例 2:对特定服务子类的等待总时间与所选组件处理时间进行比较
此示例说明了可以如何将特定类型的组件处理所耗用的时间与用于等待的时间进行比较:
SELECT SUM(TOTAL_WAIT_TIME) AS WAIT,
       SUM(TOTAL_COMPILE_PROC_TIME) AS COMPILE,
       SUM(TOTAL_IMPLICIT_COMPILE_PROC_TIME) AS IMP_COMPILE,
       SUM(TOTAL_SECTION_PROC_TIME) AS SECTION,
       SUM(TOTAL_COMMIT_PROC_TIME) AS COMMIT,
       SUM(TOTAL_REORG_PROC_TIME) AS REORG,
       SUM(TOTAL_RUNSTATS_PROC_TIME) AS RUNSTATS,
       SUM(TOTAL_ROLLBACK_PROC_TIME) AS ROLLBACK,
       SUM(TOTAL_LOAD_PROC_TIME) AS LOAD
 FROM TABLE(MON_GET_SERVICE_SUBCLASS( 'SYSDEFAULTUSERCLASS','SYSDEFAULTSUBCLASS',NULL))
运行上述查询的结果将类似于以下内容(为了便于显示,已经分割了该查询的输出行):

WAIT                 COMPILE              IMP_COMPILE          SECTION              COMMIT               
-------------------- -------------------- -------------------- -------------------- -------------------- 
                 611                 1931                    0                  395                   15 
                                                                                                                                                                                 
REORG                RUNSTATS             ROLLBACK             LOAD                                      
-------------------- -------------------- -------------------- --------------------                      
                   0                  432                   18                    0                      
                                                                                                         
                                                                                                         
  1 record(s) selected.  
可以使用所报告的数目来构造一个饼图,以显示与不同处理阶段所耗用时间进行比较的相对等待时间(不包括组件时间为 0)。
饼图,显示互相作为对比的等待时间和处理时间。
示例 3:查看耗用的总时间与不同组件中的处理时间相比较而得到的比率

此示例说明了可以如何获得在不同处理阶段(组件)执行操作所耗用的时间相对于该组件中耗用的总时间的概述。下列查询将计算执行实际处理所耗用的时间与特定组件中的耗用总时间相比较而获得的比率(用百分比表示)。

WITH PCTPROC AS (
     SELECT SUM(TOTAL_SECTION_TIME) AS SECT_TIME, SUM(TOTAL_SECTION_PROC_TIME) AS SECT_PROC_TIME, 
            SUM(TOTAL_COMPILE_TIME) AS COMP_TIME, SUM(TOTAL_COMPILE_PROC_TIME) AS COMP_PROC_TIME,
            SUM(TOTAL_IMPLICIT_COMPILE_TIME) AS IMP_C_TIME, SUM(TOTAL_IMPLICIT_COMPILE_PROC_TIME) AS IMP_C_PROC_TIME,
            SUM(TOTAL_COMMIT_TIME) AS COMMIT_TIME, SUM(TOTAL_COMMIT_PROC_TIME) AS COMMIT_PROC_TIME,
            SUM(TOTAL_ROLLBACK_TIME) AS ROLLBACK_TIME, SUM(TOTAL_ROLLBACK_PROC_TIME) AS ROLLBACK_PROC_TIME,
            SUM(TOTAL_RUNSTATS_TIME) AS RUNSTATS_TIME, SUM(TOTAL_RUNSTATS_PROC_TIME)AS RUNSTATS_PROC_TIME,
            SUM(TOTAL_REORG_TIME) AS REORG_TIME, SUM(TOTAL_REORG_PROC_TIME) AS REORG_PROC_TIME,
            SUM(TOTAL_LOAD_TIME) AS LOAD_TIME, SUM(TOTAL_LOAD_PROC_TIME) AS LOAD_PROC_TIME
     FROM TABLE(MON_GET_CONNECTION(NULL, -2)) AS METRICS)
     SELECT CASE WHEN SECT_TIME > 0 
                 THEN DEC((FLOAT(SECT_PROC_TIME) / FLOAT(SECT_TIME)) * 100,5,1) 
                 ELSE NULL END AS SECT_PROC_PCT,
            CASE WHEN COMP_TIME > 0 
                 THEN DEC((FLOAT(COMP_PROC_TIME) / FLOAT(COMP_TIME)) * 100,5,1) 
                 ELSE NULL END AS COMPILE_PROC_PCT,
            CASE WHEN IMP_C_TIME > 0 
                 THEN DEC((FLOAT(IMP_C_PROC_TIME) / FLOAT(IMP_C_TIME)) * 100,5,1) 
                 ELSE NULL END AS IMPL_COMPILE_PROC_PCT,
              CASE WHEN ROLLBACK_TIME > 0 
                 THEN DEC((FLOAT(ROLLBACK_PROC_TIME) / FLOAT(ROLLBACK_TIME)) * 100,5,1) 
                 ELSE NULL END AS ROLLBACK_PROC_PCT,
              CASE WHEN COMMIT_TIME > 0 
                 THEN DEC((FLOAT(COMMIT_PROC_TIME) / FLOAT(COMMIT_TIME)) * 100,5,1) 
                 ELSE NULL END AS COMMIT_PROC_PCT,
              CASE WHEN RUNSTATS_TIME > 0 
                 THEN DEC((FLOAT(RUNSTATS_PROC_TIME) / FLOAT(RUNSTATS_TIME)) * 100,5,1) 
                 ELSE NULL END AS RUNSTATS_PROC_PCT,
            CASE WHEN REORG_TIME > 0 
                 THEN DEC((FLOAT(REORG_PROC_TIME) / FLOAT(REORG_TIME)) * 100,5,1) 
                 ELSE NULL END AS REORG_PROC_PCT,
            CASE WHEN LOAD_TIME > 0 
                 THEN DEC((FLOAT(LOAD_PROC_TIME) / FLOAT(LOAD_TIME)) * 100,5,1) 
                 ELSE NULL END AS LOAD_PROC_PCT
       FROM PCTPROC
此查询将生成以下输出:
SECT_PROC_PCT COMPILE_PROC_PCT IMPL_COMPILE_PROC_PCT ROLLBACK_PROC_PCT COMMIT_PROC_PCT RUNSTATS_PROC_PCT REORG_PROC_PCT LOAD_PROC_PCT
------------- ---------------- --------------------- ----------------- --------------- ----------------- -------------- -------------
         57.6              0.1                     -              96.9            95.6               0.0           71.1          84.6
  1 record(s) selected.
用图形来表示此数据时,看起来可能与 图 1 中所显示的内容相似:
图 1. 用耗用总时间的百分比来表示的组件处理时间
用于显示各种组件的处理时间及其他时间(加起来为 100%)的堆叠式条形图。
示例 4:将“耗用时间”监视元素排名
在前面的示例中,所显示的所有监视元素都是在用于查询的 SQL 中显式指定的;在查询结果中,每个监视元素都显示在它自己的那一列中。但是,有时候您可能不知道要检查哪些“耗用时间”监视元素(例如,您想查看前 10 个等待时间监视元素,或者只想查看非零的“耗用时间”监视元素)。
多个表函数可用来以行组织格式显示监视元素,即,每个元素独占一行。可以用来完成此任务的表函数的名称格式为 MON_FORMAT_XML_* _BY_ROW。这些函数将从某些监视器接口返回的 XML 文档中抽取指标。(请参阅在 XML 文档中返回监视数据的接口以了解更多信息。)
当您不知道要查看哪些元素时,MON_FORMAT_XML_* _BY_ROW 函数就很有用。例如,您可能想查看名为 CLPWORKLOAD 的工作负载的前 10 个等待时间监视元素。要收集此信息,可以创建一个称为 DBSTATS 的统计事件监视器(event_wlstats 逻辑数据组)。假定您设置此事件监视器以写入某个表,缺省情况下,它会将指标记录在表 WLSTATS_DBSTATS 的列 DETAILS_XML 中。 一旦使用监视数据填充了事件监视器的输出表,就可以构造一个使用 MON_FORMAT_XML_WAIT_TIMES_BY_ROW 函数来抽取您要查看的监视元素的查询。

SELECT SUBSTR(STATS.WORKLOAD_NAME,1,15) AS WORKLOAD_NAME,
       SUBSTR(METRICS.METRIC_NAME,1,30) AS METRIC_NAME, 
       SUM(METRICS.TOTAL_TIME_VALUE) AS TOTAL_TIME_VALUE
FROM   WLSTATS_DBSTATS AS STATS, 
       TABLE(MON_FORMAT_XML_WAIT_TIMES_BY_ROW(STATS.DETAILS_XML)) AS METRICS 
WHERE  WORKLOAD_NAME='CLPWORKLOAD' AND (PARENT_METRIC_NAME='TOTAL_WAIT_TIME')
GROUP  BY WORKLOAD_NAME,METRIC_NAME 
ORDER  BY TOTAL_TIME_VALUE DESC
FETCH FIRST 10 ROWS ONLY
切记: “耗用时间”监视元素按层次结构进行组织。在此示例中,为了避免存在重复计算的等待时间,将只包括会累积到 total_wait_time 中的监视元素(请参阅前一个 SQL 语句中的 WHERE 子句)。否则,total_wait_time 本身也会包括在结果中,total_wait_time 包括若干个单独的等待时间。
下面的输出显示上述查询的结果可能为如下所示:
WORKLOAD_NAME   METRIC_NAME                    TOTAL_TIME_VALUE
--------------- ------------------------------ --------------------
CLPWORKLOAD     LOCK_WAIT_TIME                             15138541
CLPWORKLOAD     DIRECT_READ_TIME                            6116231
CLPWORKLOAD     POOL_READ_TIME                              6079458
CLPWORKLOAD     DIRECT_WRITE_TIME                            452627
CLPWORKLOAD     POOL_WRITE_TIME                              386208
CLPWORKLOAD     IPC_SEND_WAIT_TIME                           283172
CLPWORKLOAD     LOG_DISK_WAIT_TIME                           103888
CLPWORKLOAD     DIAGLOG_WRITE_WAIT_TIME                       78198
CLPWORKLOAD     IPC_RECV_WAIT_TIME                            15612
CLPWORKLOAD     TCPIP_SEND_WAIT_TIME                           3291

  10 record(s) selected.