将 XML 文档中的指标监视元素作为表行来查看

要查看从事件监视器返回的 XML 文档中包含的与指标相关的信息,其中一种方法是将它转换为以下格式:让每个监视元素单独占用一行。 如果您希望采用基于文本的格式来查看信息,但是具体又不知道要检查哪些监视元素,那么采用此格式就很有用。

关于此任务

要查看由各种监视接口返回的 XML 文档中行格式的指标信息,请使用 MON_FORMAT_XML_*_BY ROW 表函数。

过程

对于程序包高速缓存事件监视器所跟踪的语句,此任务中所显示的示例使用 MON_FORMAT_XML_TIMES_BY_ROW 表函数来查看该语句的组件时间。它假定已经创建并激活了一个称为 PKGCACHEEVENTS 的程序包高速缓存事件监视器。程序包高速缓存事件监视器将它的输出写入无格式的事件 (UE) 表。在可以使用 UE 表之前,必须使用 EVMON_FORMAT_UE_TO_TABLES 存储过程将此 UE 表中的数据转换为关系表,或者使用 EVMON_FORMAT_UE_TO_XML 表函数将它转换为 XML。此任务说明了这两种方法中的第一种方法。

  1. 首先,对于程序包高速缓存事件监视器写入的无格式事件 (UE) 表,使用 EVMON_FORMAT_UE_TO_TABLES 过程将此表转换为关系表
    call EVMON_FORMAT_UE_TO_TABLES ('PkgCache',NULL,NULL,NULL,NULL,NULL,
         NULL,0,'SELECT * FROM PKGCACHEEVENTS')
    此过程将创建两个表:
    • 一个表称为 PKGCACHE_EVENT,它包含称为 METRICS 的一列。此列中又包含具有指标监视元素的 XML 文档。
    • 另一个表称为 PKGCACHE_METRICS。
      注: 您可以直接查看 PKGCACHE_METRICS 表的各列中的指标,而不必从 PKGCACHE_EVENT 表的 METRICS 列中抽取指标。但是,当您检查 PKGCACHE_METRICS 表时,指标将按列而不是按行显示;并不是很容易获得如具有最大值的指标的排名。
  2. 查询上一步所生成的两个表,以根据执行时间来确定哪个语句的成本最高:
    SELECT EVENTS.EXECUTABLE_ID, 
           SUM(METRICS.STMT_EXEC_TIME) AS TOTAL_STMT_EXEC_TIME
    FROM   PKGCACHE_EVENT AS EVENTS, 
           PKGCACHE_METRICS AS METRICS 
    WHERE  EVENTS.XMLID = METRICS.XMLID 
    GROUP  BY EVENTS.EXECUTABLE_ID
    ORDER  BY TOTAL_STMT_EXEC_TIME DESC
    FETCH  FIRST 5 ROWS ONLY
    在上述查询中,连接了在步骤 1 中所生成的两个表,以便 PKGCACHE_EVENT 表中的语句标识可以与它们在 PKGCACHE_METRICS 表中的执行时间相关联。
    EXECUTABLE_ID                                                       TOTAL_STMT_EXEC_TIME
    ------------------------------------------------------------------- --------------------
    x'01000000000000001A0300000000000000000000020020091215115933859000'                  250
    x'0100000000000000150300000000000000000000020020091215115850328000'                  191
    x'0100000000000000210200000000000000000000020020091215115818343001'                  129
    x'0100000000000000C40200000000000000000000020020091215115838578000'                   41
    x'0100000000000000B00200000000000000000000020020091215115838203000'                   38
    
      5 record(s) selected.
    结果中的第一项表示总体执行时间最长的语句。
  3. 可选: 如果您愿意,可以使用以下 SQL 来显示该语句的文本:
    SELECT SUBSTR(STMT_TEXT,1,60) AS STMT_TEXT 
    FROM PKGCACHE_EVENT 
    WHERE EXECUTABLE_ID = x'01000000000000001A0300000000000000000000020020091215115933859000'
    结果:
    STMT_TEXT
    ------------------------------------------------------------
    DROP XSROBJECT MYSCHEMA.EVMON_PKGCACHE_SCHEMA_SQL09070
    
      1 record(s) selected.
  4. 对于您在步骤 2 中所标识的语句,使用 MON_FORMAT_XML_TIMES_BY_ROW 表函数来查看该语句的“耗用时间”监视元素的列表:
    SELECT SUBSTR(XMLMETRICS.METRIC_NAME,1,30) AS METRIC_NAME,
           XMLMETRICS.TOTAL_TIME_VALUE, 
           SUBSTR(XMLMETRICS.PARENT_METRIC_NAME,1,30) AS PARENT_METRIC_NAME
    FROM PKGCACHE_EVENT AS EVENTS, 
         TABLE(MON_FORMAT_XML_TIMES_BY_ROW(EVENTS.METRICS)) AS XMLMETRICS 
    WHERE EVENTS.EXECUTABLE_ID=
    x'01000000000000001A0300000000000000000000020020091215115933859000' 
     AND PARENT_METRIC_NAME='STMT_EXEC_TIME'
    ORDER BY XMLMETRICS.TOTAL_TIME_VALUE DESC
    
    备注:
    • 请记住,“耗用时间”监视元素按层次结构进行组织。为了避免重复计算,结果中将只包括那些累积到 stmt_exec_time 的指标。否则,stmt_exec_time 本身也会包括在结果中,stmt_exec_time 包括若干个单独的组件时间。
    • 为了便于说明,包括了由 MON_FORMAT_XML_TIMES_BY_ROW 返回的其中一列 PARENT_METRIC_NAME。
    运行此查询时,它将返回下列结果:
    METRIC_NAME                    TOTAL_TIME_VALUE     PARENT_METRIC_NAME
    ------------------------------ -------------------- ------------------------------
    TOTAL_ACT_WAIT_TIME                             234 STMT_EXEC_TIME
    TOTAL_SECTION_PROC_TIME                          15 STMT_EXEC_TIME
    在此处,您可以看到总的处理时间加起来为 249 ms。将此时间与步骤 2 中所显示的 250 ms 的总时间进行比较;多余的毫秒数是未包括在 stmt_exec_time 中的其他时间(例如,等待时间)造成的。

结果

在前一个示例的结果中,您可以看到指标的布置:它们按面向行的格式进行显示,每行只显示一个指标。使用此方法的优点在于,您不需要提前知道要查看哪些指标或者监视元素。如果您要查看其值排名前五位的耗时指标或位于特定值范围内的指标,那么可轻松创建查询以返回您所关心的结果。相比之下,如果您使用 XMLTABLE 函数将监视元素按列显示,那么需要指定要显示哪些监视元素(否则将显示所有监视元素)。

示例

查看由 MON_GET_*_DETAILS 表函数生成的 DETAILS 列的内容

还可以使用 MON_FORMAT_XML_*_BY_ROW 函数来查看由任何 MON_GET_*_DETAILS 函数返回的 DETAILS 列的内容。例如,MON_GET_CONNECTION_DETAILS 将返回一个 DETAILS 列,此列中包含一个 XML 文档,而此 XML 文档中具有与数据库连接有关的指标。

例如,要查看所有成员中每个连接的非零组件时间,可以使用下列查询:
SELECT CONDETAILS.APPLICATION_HANDLE, 
       SUBSTR(XMLMETRICS.METRIC_NAME,1,30) AS METRIC_NAME, 
       SUM(XMLMETRICS.TOTAL_TIME_VALUE) AS TOTAL_TIME_VALUE, 
       SUBSTR(XMLMETRICS.PARENT_METRIC_NAME,1,30) AS PARENT_METRIC_NAME
FROM TABLE(MON_GET_CONNECTION_DETAILS(NULL,-1)) AS CONDETAILS, 
     TABLE(MON_FORMAT_XML_COMPONENT_TIMES_BY_ROW(CONDETAILS.DETAILS))AS XMLMETRICS 
WHERE TOTAL_TIME_VALUE > 0 AND XMLMETRICS.PARENT_METRIC_NAME='TOTAL_RQST_TIME'
GROUP BY CONDETAILS.APPLICATION_HANDLE, 
         XMLMETRICS.PARENT_METRIC_NAME, 
         XMLMETRICS.METRIC_NAME
ORDER BY CONDETAILS.APPLICATION_HANDLE ASC, TOTAL_TIME_VALUE DESC
备注:
  • 为了避免重复计算,结果中将只包括那些累积到 total_rqst_time 的指标 (WHERE .... XMLMETRICS.PARENT_METRIC_NAME='TOTAL_RQST_TIME')。 否则,total_rqst_time 本身也会包括在结果中,total_rqst_time 包括若干个单独的组件时间。
  • 为了便于说明,包括了由 MON_FORMAT_XML_COMPONENT_TIMES_BY_ROW 返回的其中一列 PARENT_METRIC_NAME。
上述查询将返回下列结果:
APPLICATION_HANDLE   METRIC_NAME                    TOTAL_TIME_VALUE     PARENT_METRIC_NAME
-------------------- ------------------------------ -------------------- ------------------------------
                  52 TOTAL_SECTION_TIME                             3936 TOTAL_RQST_TIME
                  52 TOTAL_COMPILE_TIME                              482 TOTAL_RQST_TIME
                  52 TOTAL_COMMIT_TIME                                15 TOTAL_RQST_TIME
                  52 TOTAL_ROLLBACK_TIME                               1 TOTAL_RQST_TIME
                 496 TOTAL_COMPILE_TIME                              251 TOTAL_RQST_TIME
                 496 TOTAL_SECTION_TIME                               46 TOTAL_RQST_TIME
                 496 TOTAL_IMPLICIT_COMPILE_TIME                       5 TOTAL_RQST_TIME

  7 record(s) selected.
如此示例所示,将只包括组成 total_rqst_time 的指标。如果查询中不包含 WHERE .... XMLMETRICS.PARENT_METRIC_NAME='TOTAL_RQST_TIME' 子句,那么结果将类似于以下显示的这些结果:
APPLICATION_HANDLE   METRIC_NAME                    TOTAL_TIME_VALUE     PARENT_METRIC_NAME
-------------------- ------------------------------ -------------------- ------------------------------
                  52 TOTAL_RQST_TIME                                4603 -
                  52 TOTAL_SECTION_TIME                             3942 TOTAL_RQST_TIME
                  52 TOTAL_COMPILE_TIME                              537 TOTAL_RQST_TIME
                  52 TOTAL_SECTION_SORT_TIME                         299 TOTAL_SECTION_TIME
                  52 TOTAL_COMMIT_TIME                                15 TOTAL_RQST_TIME
                  52 TOTAL_ROLLBACK_TIME                               1 TOTAL_RQST_TIME
                 496 TOTAL_RQST_TIME                                 341 -
                 496 TOTAL_COMPILE_TIME                              251 TOTAL_RQST_TIME
                 496 TOTAL_SECTION_TIME                               46 TOTAL_RQST_TIME
                 496 TOTAL_IMPLICIT_COMPILE_TIME                       5 TOTAL_RQST_TIME
                 496 TOTAL_SECTION_SORT_TIME                           2 TOTAL_SECTION_TIME

  11 record(s) selected.
在此示例中,结果中包括每个连接的 total_rqst_time 值,其中包括作为其子代的所有其他元素的值。同样,用斜体字显示的各项的值都累积到 total_section_time 中。如果未从 WHERE 子句中将它们排除,由于 total_section_time 本身也累积到 total_rqst_time 中,所以结果中已经将它们重复计算了三次。