DB2模式操作细节

时间:2018-09-26 18:17:30

标签: db2 db2-luw

我试图找出以下格式的特定模式所发生的操作次数

schemaname operation_count
ibmschema  2

操作可以为CREATE TABLE ,INSERT ,UPDATE ,SELECT ,DELETE ,DROP TABLE

是否存在艾米元数据表以在DB2 10 LUW中获取此类信息

1 个答案:

答案 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的方法)。另外,语句不是按操作标记的(如果使用更改的表引用或触发器等,则可以在一个语句中使用INSERTUPDATEDELETESELECT)。因此,您最终不得不进行一些简单的分类,例如

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从比赛中删除所有开头的注释)