我试图找出以下格式的特定模式所发生的操作次数
schemaname operation_count
ibmschema 2
操作可以为CREATE TABLE ,INSERT ,UPDATE ,SELECT ,DELETE ,DROP TABLE
是否存在艾米元数据表以在DB2 10 LUW中获取此类信息
答案 0 :(得分:0)
Db2不会(默认)记录发生的所有操作。在每天处理数百万个事务的OLTP系统中,记录每条语句的开销将是巨大的开销
Db2确实具有活动的内存中统计信息,并且这些数据在MON
表函数中可用。自从实例上次重新启动以来,这些统计信息是累积的,但仅适用于当前在软件包高速缓存中的语句的软件包高速缓存统计信息之类的东西除外。
您可以创建事件监视器以捕获更多详细信息。有关这些信息,请参阅知识中心,或者考虑使用Data Server Manager来帮助捕获额外的数据。
如果您需要此信息来满足审计要求,请考虑使用db2审计工具,该工具可以防止未经授权的篡改。
不过,如果要按模式插入插入的行数(自上一次实例重新启动以来),可以快速从MON_GET_TABLE
派生。例如。
SELECT V.* FROM
( SELECT
TABSCHEMA
, SUM(ROWS_READ) ROWS_READ
, SUM(ROWS_INSERTED) ROWS_INSERTED
, SUM(ROWS_UPDATED) ROWS_UPDATED
, SUM(ROWS_DELETED) ROWS_DELETED
FROM
TABLE(MON_GET_TABLE(NULL,NULL,-2))
GROUP BY
TABSCHEMA
), TABLE(VALUES
(TABSCHEMA, 'ROWS_READ' ,ROWS_READ)
, (TABSCHEMA, 'ROWS_INSERTED',ROWS_INSERTED )
, (TABSCHEMA, 'ROWS_UPDATED' ,ROWS_UPDATED )
, (TABSCHEMA, 'ROWS_DELETED' ,ROWS_DELETED )
) AS V(SCHEMA, OPERATION, COUNT)
ORDER BY 1,2
将会返回例如
SCHEMA OPERATION COUNT
-------- ------------- ---------
PAUL ROWS_DELETED 0
PAUL ROWS_INSERTED 10
PAUL ROWS_READ 321954698
PAUL ROWS_UPDATED 0
SYSIBM ROWS_DELETED 4883
SYSIBM ROWS_INSERTED 4954
SYSIBM ROWS_READ 575652
SYSIBM ROWS_UPDATED 340
如果您要对语句进行计数,则会遇到许多语句可以跨越架构的问题。没有一种简单的方法可以知道语句的“模式”(缺少自行分析SQL的方法)。另外,语句不是按操作标记的(如果使用更改的表引用或触发器等,则可以在一个语句中使用INSERT
,UPDATE
,DELETE
和SELECT
)。因此,您最终不得不进行一些简单的分类,例如
SELECT SUM(NUM_EXECUTIONS) EXECS, OPERATION FROM (
SELECT NUM_EXECUTIONS
, CASE
WHEN UPPER(SUBSTR(STMT_TEXT,1,6)) = 'INSERT' THEN 'INSERT'
WHEN UPPER(SUBSTR(STMT_TEXT,1,6)) = 'UPDATE' THEN 'UPDATE'
WHEN UPPER(SUBSTR(STMT_TEXT,1,6)) = 'SELECT' THEN 'SELECT'
WHEN UPPER(SUBSTR(STMT_TEXT,1,6)) = 'VALUES' THEN 'VALUES'
WHEN UPPER(SUBSTR(STMT_TEXT,1,6)) = 'CREATE' THEN 'CREATE'
WHEN UPPER(SUBSTR(STMT_TEXT,1,6)) = 'DELETE' THEN 'DELETE'
WHEN UPPER(SUBSTR(STMT_TEXT,1,5)) = 'MERGE' THEN 'MERGE'
WHEN UPPER(SUBSTR(STMT_TEXT,1,3)) = 'SET' THEN 'SET'
WHEN UPPER(SUBSTR(STMT_TEXT,1,4)) = 'DROP' THEN 'DROP'
WHEN UPPER(SUBSTR(STMT_TEXT,1,4)) = 'WITH' THEN 'WITH'
WHEN UPPER(SUBSTR(STMT_TEXT,1,4)) = 'CALL' THEN 'CALL'
WHEN UPPER(SUBSTR(STMT_TEXT,1,4)) = 'LOCK' THEN 'LOCK'
WHEN UPPER(SUBSTR(STMT_TEXT,1,7)) = 'DECLARE' THEN 'DECLARE'
ELSE UPPER(SUBSTR(STMT_TEXT,1,6)) END OPERATION
FROM
TABLE(MON_GET_PKG_CACHE_STMT ( '', NULL, NULL, -2)) AS T
) GROUP BY OPERATION
可能会返回例如
EXECS OPERATION
----- ---------
123 CALL
78 DECLARE
12 DELETE
4 INSERT
34 LOCK
63036 SELECT
964 SET
21218 UPDATE
3 VALUES
100 WITH
((但不能处理以注释开头的语句。当您移至Db2 11.1时,可以使用REGEXP_LIKE从比赛中删除所有开头的注释)