监控 DB2 9.7,第 2 部分: 在 DB2 9.7 中对 XML 事件监控器数据进行关系访问

让您了解如何获得对监控器数据子集的关系访问,该子集由 IBM® DB2® for Linux®, UNIX®, and Windows® Version 9.7 (DB2) 中的活动或统计事件监控器以 XML 文档形式捕获。

Scott Walkty, 软件开发人员, IBM

Scott Walkty 是 DB2 Monitoring and Workload Manager 团队的软件开发人员。他是 Workload Manager 解决方案最初的开发人员之一,过去两年从事 DB2 的各种监控改进。他曾经在 DB2 Tools 团队工作过五年。Scott 拥有 University of Manitoba 的计算机科学硕士学位。



2011 年 2 月 28 日

背景

在 IBM DB2 9.7 中,活动和统计事件监控器都具有 DETAILS_XML 监控器元素,该元素存储包含大量活动和系统指标的 XML 文档。

对于活动事件监控器来说,在活动逻辑数据组(event_activity)中收集 DETAILS_XML 元素。对于统计事件监控器来说,在 scstatswlstats 逻辑数据组(event_wlstatsevent_scstats)中收集 DETAILS_XML 元素。包含在 XML 文档中的指标包括在 DB2 9.7 中引入的新耗时指标,其提供 DB2 花费时间的细分,以及一些计数器和其他类型的监控器元素。

DETAILS_XML 元素中报告的 XML 文档结构在 sqllib/misc 目录下的 DB2MonCommon.xsd 架构中定义。活动事件监控器中的 DETAILS_XML 元素包含一个根元素(activity_metrics)类型是 activity_level_metrics 的文档,而统计事件监控器中的 DETAILS_XML 元素包含一个根元素(system_metrics)类型是 system_level_metrics 的文档。

要获得有关可用于这些文档的监控器元素的详细信息,请参考架构文件或 DB2 信息中心

以 XML 文档形式捕获监控器元素可在利用指标上为您提供最大的灵活性。通过 XML 文档,您可以执行任何数量的操作,包括以下操作:

  • 通过应用样式表可轻松生成报告从而以您选择的格式提取所感兴趣的指标,如文本、html 等等。
  • 以基于行的格式提取指标,该格式允许对相关指标分组和排序。您可以使用下列过程中的一个来执行此操作:MON_FORMAT_XML_WAIT_TIME_BY_ROWMON_FORMAT_XML_COMPONENT_TIMES_BY_ROWMON_FORMAT_XML_TIMES_BY_ROWMON_FROMAT_XML_METRICS_BY_ROW。例如,对于给定的语句来说,通过使用基于 MON_FORMAT_XML_WAIT_TIMES_BY_ROW 函数的 SQL 语句,列出该语句遇到的所有等待时间,并且按从最高到最低排序,您可以发现最影响该语句的等待时间。
  • 使用 XMLTABLE 函数以基于列的(关系)格式提取指标,在跨对象排序时此项非常有用,例如,查找前 10 位的 CPU 消耗语句或服务类。

此外,可以在 DB2 的未来版本中引入了新的监控器元素,而无需迁移和/或更新事件监控器表,减少了事件监控器的维护要求。随着产品或修复包引入新的监控元素,所以这些元素将显示在已捕获的 XML 文档中,即使它们也在其他地方提供。文档的使用者可选择是否公开新元素。

XML 表示的一个缺点是其需要了解 XML 文档的内容和 DB2 XML 格式化函数,以便有效地提取并使用监控数据。虽然 DB2 9.7 附带了内置函数,以便从这些 XML 文档中以基于行的格式提取监控器元素,但是不存在相应的内置函数来以关系(基于列的)格式提取监控信息。在监控器信息只可用于 XML 文档的情况下,例如统计事件监控器,如果您想以关系格式访问这些信息,则您需要使用 XMLTABLE 函数来手动提取监控信息。


简化对 XML 事件监控器数据的关系访问

本文提供了称为 GENERATE_MON_UDFS 的存储过程。它创建了以下两种新的表函数:

  • SYS_METRICS_TO_RELATIONAL
  • ACT_METRICS_TO_RELATIONAL

这些表函数采用 XML 文档作为输入,然后为 DB2MonCommon.xsd 文件中描述的每个指标输出一列。在后台,它们使用 XMLTABLE 函数从输入文档中提取监控器元素。GENERATE_MON_UDFS 存储过程使用 XSLT 转换,以便从 DB2MonCommon.xsd 文件直接生成 UDF 定义,确保 XML 模式中的任何指标都表示为相应表函数中的一列。

在本文附带的 genmon.db2 脚本中定义 GENERATE_MON_UDFS 过程。要创建 GENERATE_MON_UDFS 过程,请使用以下语句运行 genmon.db2 脚本:

db2 -td@ -f genmon.db2

通过如下所示调用该过程来创建关系访问函数,包括将完整路径名作为输入传递到 sqllib/misc 目录作为单个输入参数:

CALL GENERATE_MON_UDFS( '/home/dbuser/sqllib/misc' )

在执行该过程后创建新的表函数。要列出表函数的输出列,请执行以下语句:

DESCRIBE SELECT * FROM TABLE(ACT_METRICS_TO_RELATIONAL(NULL)) AS T
DESCRIBE SELECT * FROM TABLE(SYS_METRICS_TO_RELATIONAL(NULL)) AS T

正如背景部分所描述的那样,可在修复包或版本范围内添加新的监控器元素。在调用 GENERATE_MON_UDFS 过程时,已生成的表函数只报告出现在 DB2MonCommon.xsd 文件中的监控器元素。要使任何新的监控器元素由这些表函数来处理,只需重新执行 GENERATE_MON_UDFS 过程。该过程将用包含已引入的任何新监控器元素的新版本来替换现有的 ACT_METRICS_TO_RELATIONALSYS_METRICS_TO_RELATIONAL 表函数。


示例

以下示例显示了如何轻松地使用表函数来访问 DETAILS_XML 事件监控器元素中的监控器数据。这些示例假设您已经使用类似下面的语句创建了名为 A 的活动事件监控器和名为 S 的统计事件监控器:

CREATE EVENT MONITOR A FOR ACTIVITIES WRITE TO TABLE
CREATE EVENT MONITOR S FOR STATISTICS WRITE TO TABLE

示例 1:使用通过统计事件监控器捕获的历史服务类信息,您将通过 CPU 消耗对服务类排序。通过查看在 SCSTATS 逻辑数据组中捕获到 DETAILS_XML 文档中的 total_cpu_time 监控器元素,您可以找到服务类的 CPU 消耗。

SELECT S.SERVICE_SUPERCLASS_NAME, 
                S.SERVICE_SUBCLASS_NAME, 
                SUM(T.TOTAL_CPU_TIME) TOT_CPU 
FROM SCSTATS_S AS S,  TABLE(SYS_METRICS_TO_RELATIONAL(S.DETAILS_XML)) AS T 
GROUP BY S.SERVICE_SUPERCLASS_NAME, S.SERVICE_SUBCLASS_NAME ORDER BY TOT_CPU DESC

示例 2:您想列出活动事件监控器捕获的前 10 位 CPU 消耗活动的语句文本。通过查看在 ACTIVITY 逻辑数据组中捕获到的 DETAILS_XML 文档中的 total_cpu_time 监控器元素,您可以找到活动的 CPU 消耗。

WITH ACTIVITY_CPU AS (
  SELECT A.APPL_ID,
         A.UOW_ID,
         A.ACTIVITY_ID,
         SUM(T.TOTAL_CPU_TIME) AS TOTAL_CPU_TIME
  FROM ACTIVITY_A AS A, TABLE(ACT_METRICS_TO_RELATIONAL(A.DETAILS_XML)) AS T 
  GROUP BY APPL_ID, UOW_ID, ACTIVITY_ID)
SELECT A.TOTAL_CPU_TIME,
       A.APPL_ID,
       A.UOW_ID,
       A.ACTIVITY_ID, 
       S.STMT_TEXT 
FROM ACTIVITY_CPU A, ACTIVITYSTMT_A AS S 
WHERE A.APPL_ID = S.APPL_ID AND
      A.UOW_ID = S.UOW_ID AND
      A.ACTIVITY_ID = S.ACTIVITY_ID
ORDER BY A.TOTAL_CPU_TIME DESC
FETCH FIRST 10 ROWS ONLY

示例 3:您想将为 SCSTATS 逻辑组中每一个服务类捕获的指标提取到关系表中。这使得指标可以以关系格式重复访问,而无需每次访问都解析 XML 文档。

首先创建一个表来存储指标:

CREATE TABLE SCMETRICS_S AS 
(SELECT S.STATISTICS_TIMESTAMP, 
                 S.PARTITION_NUMBER, 
                 S.SERVICE_SUPERCLASS_NAME, 
                 S.SERVICE_SUBCLASS_NAME, S.SERVICE_CLASS_ID, 
                 T.* 
FROM SCSTATS_S AS S,  TABLE(SYS_METRICS_TO_RELATIONAL(S.DETAILS_XML)) AS T) 
WITH NO DATA

然后使用 SYS_METRICS_TO_RELATIONAL 表函数从 SCSTATS 逻辑组的 DETAILS_XML 元素中提取指标并填充已创建的表:

INSERT INTO SCMETRICS_S 
(SELECT S.STATISTICS_TIMESTAMP, 
                 S.PARTITION_NUMBER, 
                 S.SERVICE_SUPERCLASS_NAME, 
                 S.SERVICE_SUBCLASS_NAME, 
                 S.SERVICE_CLASS_ID, 
                 T.* 
FROM SCSTATS_S AS S, TABLE(SYS_METRICS_TO_RELATIONAL(S.DETAILS_XML)) AS T)

正如这些示例所演示的那样,您可以访问监控器元素,而无需知道或关心作为 XML 文档捕获的元素。您无需了解基础 XML 文档的结构。访问严格地通过关系界面进行。


结束语

本文已经显示了一个过程,您可以使用该过程自动生成表函数,其以关系格式报告以 XML 文档形式捕获的事件监控器元素。生成的表函数对调用者隐藏了基础 XML 文档的详细信息和结构,并且为那些希望以关系表形式访问监控器元素的人简化了事件监控器数据的用法。您可以使用这些表函数轻松地将 XML 文档的内容集成到 SQL 语句中,或者通过将它们提取到单独的表中来将 XML 文档的内容移动到纯关系形式中。


致谢

作者感谢 Paul Bird 审阅本文。


下载

描述名字大小
本文的样例 DB2 脚本genmon.db210KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=629744
ArticleTitle=监控 DB2 9.7,第 2 部分: 在 DB2 9.7 中对 XML 事件监控器数据进行关系访问
publish-date=02282011