DB2 模式操作细节

DB2 schema operation details

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

schemaname operation_count
ibmschema  2

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

在 DB2 10 LUW 中是否有元数据 table 来获取此类信息

Db2 不会(默认情况下)记录发生的每个操作。在每天有数百万事务的 OLTP 系统中,记录每条语句的开销将是一个很大的开销

Db2 确实有关于 activity 的内存统计信息,并且此数据在 MON table 函数中可用。自实例上次重新启动以来,这些统计信息是累积的,除了包缓存统计信息之类的内容,它们仅适用于当前在包缓存中的语句。

您可以创建事件监视器来捕获更详细的信息。有关这些信息,请参阅知识中心,或考虑使用数据服务器管理器来帮助捕获这一额外级别的数据。

如果您需要此信息来满足审计要求,请考虑 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

这会 return 例如

 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

如果你想要语句的计数,你会遇到许多语句可以跨模式的问题。没有简单的方法可以知道语句的 "schema"(除非自己解析 SQL)。此外,语句不会被操作标记(如果您使用更改的 table 引用或触发器,则可以在一个语句中 INSERTUPDATEDELETESELECT ETC)。所以你最终不得不做一些简单的分类,比如这个

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

这可能 return 例如

 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 从匹配中删除任何前导注释)