示例:使用变更历史记录事件监视器来列示所有已落实 DDL 语句

可使用变更历史记录事件监视器来快速列示所有已执行的已落实 DDL 语句,以确定任何所做更改是否可能正在影响工作负载。

方案

在此示例中,数据库管理员 (DBA) 注意到过去 24 小时许多查询性能下降。DBA 使用变更历史记录事件监视器来快速检查该时间段执行的 DDL,以确定是否进行了可能对工作负载有很大影响的任何更改(例如,删除的索引)。DBA 先前创建了名为 CHGHIST 的变更历史记录事件监视器,它用于跟踪 DDL 语句。DBA 发出了以下语句以列示变更历史记录事件监视器在过去 24 小时内捕获的所有已落实 DDL 语句。所发出语句排除了通过 ROLLBACK 语句或 ROLLBACK TO SAVEPOINT 语句回滚的语句。
请注意,变更历史记录事件监视器记录执行 DDL 时的 DDL 事件。DDL 是否导致数据库中发生任何更改取决于要落实的 DDL。
WITH savepoint_rollbacks (global_tran_id, local_tran_id, savepoint_id) AS
   (SELECT DISTINCT T.global_transaction_id, T.local_transaction_id, T.savepoint_id
      FROM DDLSTMTEXEC_CHGHIST as D, TXNCOMPLETION_CHGHIST as T
      WHERE T.txn_completion_status='S' AND
            D.savepoint_id >= T.savepoint_id AND
            D.event_timestamp <= T.event_timestamp)
   SELECT VARCHAR(D.STMT_TEXT, 70) AS STMT_TEXT FROM DDLSTMTEXEC_CHGHIST as D,
            TXNCOMPLETION_CHGHIST as T
      WHERE D.global_transaction_id = T.global_transaction_id AND
            D.local_transaction_id = T.local_transaction_id AND
            T.txn_completion_status = 'C' AND
            (D.global_transaction_id, D.local_transaction_id, D.savepoint_id)
   NOT IN (SELECT * FROM savepoint_rollbacks) AND
            D.EVENT_TIMESTAMP > CURRENT TIMESTAMP - 24 HOURS;

STMT_TEXT
----------------------------------------------------------------------
CREATE INDEX I1 ON T1 (ONE)

1 record(s) selected.