Oracle 执行哪些查询、执行的频率和时间?

Jas*_*per 6 performance oracle

我有一个(Java)Web 应用程序,它当然会对 Oracle 数据库执行许多查询(选择、插入、更新、删除)。

我想了解过去 7 天的以下内容:

    SQLQuery          Times-Executed   Average-Resp-Time    Average-Rows-Returned
====================================================================================
    SELECT whatever     981            330ms                1201
    UPDATE whatever     45             99ms                 0
Run Code Online (Sandbox Code Playgroud)

这是 Oracle 可以给我的东西吗?如果是这样,我怎样才能得到它?如果不是 Oracle,我应该看看 JDBC 驱动程序吗?

Chr*_*xon 10

注意:使用 AWR 数据需要您购买诊断包许可选项。没有必要的许可证也可以运行下面的查询。在使用这些之前,请务必与您的 DBA/许可经理核对。

Automatic Workload Repository (AWR) 包含数据库活动的详细信息。这些存储在各种dba_hist*视图中。

您要查找的信息类型主要在dba_hist_sqlstat视图中可用。通过加入它,dba_hist_snapshot您可以获得特定时期内可用的信息:

select * 
from   dba_hist_sqlstat t, dba_hist_snapshot s
where  t.snap_id = s.snap_id
and    t.dbid = s.dbid
and    t.instance_number = s.instance_number
and    s.begin_interval_time between trunc(sysdate)-1 and trunc(sysdate) -- yesterday's stats
Run Code Online (Sandbox Code Playgroud)

此视图包含多个*_elapsed列,这些列说明给定快照(时间段)的增加。例如:

  • ELAPSED_TIME_DELTA
  • CPU_TIME_DELTA
  • ROWS_PROCESSED_DELTA
  • BUFFER_GETS_DELTA
  • DISK_READS_DELTA
  • PARSE_CALLS_DELTA
  • EXECUTIONS_DELTA

时间以微秒为单位。您可以将这些结合起来获得平均时间/执行统计数据等等。例如,这为您提供给定 sql 语句的平均时间/执行时间:

select sql_id, sum(t.elapsed_time_delta/1000000)/sum(t.executions_delta)
from   dba_hist_sqlstat t, dba_hist_snapshot s
where  t.snap_id = s.snap_id
and    t.dbid = s.dbid
and    t.instance_number = s.instance_number
and    s.begin_interval_time between trunc(sysdate)-1 and trunc(sysdate) -- yesterday's stats
group  by sql_id
Run Code Online (Sandbox Code Playgroud)

sql_id是SQL本身的文本的哈希值。您可以从以下位置找到实际声明:

select * from dba_hist_sqltext where sql_id = :sqlid
Run Code Online (Sandbox Code Playgroud)

请注意,AWR 中仅保留“消耗最高”的语句。因此,如果您感兴趣的查询不是最慢、执行最多、磁盘访问最多等的查询,那么它可能不在 AWR 数据中。您可以通过“着色”感兴趣的 sql_id 来解决这个问题。这可确保只要您设置了保留期,它们就会一直保留在 AWR 中。你可以通过运行来做到这一点:

exec DBMS_WORKLOAD_REPOSITORY.ADD_COLORED_SQL(:sqlid);
Run Code Online (Sandbox Code Playgroud)

如果您只想了解某个时间段内的系统概览(包括“最重”的 SQL 语句),AWR 报告本身就提供了这一点。您可以在oracle-base上找到对此的介绍。