如何从ContentStore数据库获取Cognos报表执行时长(无审计功能)
未启用审计时查询Cognos报表执行时长的方案
首先明确:未启用Cognos审计功能的前提下,ContentStore数据库不会长期存储报表的执行历史(包括起止时间、时长),这些数据仅在报表运行期间临时存于内存或部分临时表中,Cognos服务重启后就会丢失。不过你可以查询以下临时表获取近期(未重启服务前)的执行记录:
1. 核心查询语句(以DB2为例)
关联CMOBJECTS和临时运行会话表,筛选执行时长超过X分钟的报表:
SELECT obj.NAME AS 报表名称, obj.CMID AS 报表ID, exec.START_TIME AS 开始时间, exec.END_TIME AS 结束时间, -- 计算执行时长(分钟) TIMESTAMPDIFF(2, CHAR(exec.END_TIME - exec.START_TIME)) AS 执行时长_分钟 FROM CMOBJECTS obj JOIN COGIPF_RUNSESSION exec ON obj.CMID = exec.REPORT_ID WHERE -- 替换X为你的时长阈值 TIMESTAMPDIFF(2, CHAR(exec.END_TIME - exec.START_TIME)) > X -- 可选:仅筛选已完成的报表 AND exec.STATUS = 'C' ORDER BY 执行时长_分钟 DESC;
不同数据库的时间差语法调整:
- Oracle:
(END_TIME - START_TIME)*24*60 - SQL Server:
DATEDIFF(MINUTE, START_TIME, END_TIME) - PostgreSQL:
EXTRACT(EPOCH FROM (END_TIME - START_TIME))/60
2. 备选查询(若上述表无数据)
尝试查询存储查询级执行信息的COGIPF_QUERY表:
SELECT obj.NAME AS 报表名称, qry.START_TIME, qry.END_TIME, TIMESTAMPDIFF(2, CHAR(qry.END_TIME - qry.START_TIME)) AS 执行时长_分钟 FROM CMOBJECTS obj JOIN COGIPF_QUERY qry ON obj.CMID = qry.REPORT_ID WHERE TIMESTAMPDIFF(2, CHAR(qry.END_TIME - qry.START_TIME)) > X AND qry.STATUS = 'C' ORDER BY 执行时长_分钟 DESC;
3. 关键局限性
- 临时表仅保留**当前运行中或最近完成(未重启服务)**的任务,重启后数据全部丢失,无法获取历史执行记录。
- 表结构可能随Cognos版本略有变化,建议先查看目标表的字段结构确认可用性。
- 若需要长期保存并查询报表执行数据,唯一可靠的方案是启用Cognos审计功能,审计数据会持久化存储到
COGIPF_*系列表中。
内容的提问来源于stack exchange,提问作者dany allaw
相关产品推荐
相关产品推荐

