如何查询Oracle数据库一周内每天的SQL执行次数
一、问题:
今天引入的问题是:oracle数据库怎么查询一周内,每天的查询次数?
正好这周在学数据库的调优工作,我记得数据库的AWR报告会记录SQL的执行情况,可以从DBA_HIST_SNAPSHOT里面找出7天的快照ID,在DBA_HIST_SQLSTAT收集一下。
先来了解一下相关视图
二、相关视图:
dba_hist_sqlstat 和dba_hist_snapshot视图是 Oracle AWR(Automatic Workload Repository)的一部分。其中,
1、DBA_HIST_SQLSTAT
dba_hist_sqlstat是Oracle数据库中的历史SQL统计信息视图,用于提供有关SQL语句执行的历史性能信息。它记录了SQL语句的执行计划、执行时间、消耗的资源等统计数据。dba_hist_sqlstat可以用于监控和分析数据库中的SQL性能问题。
常用字段:
SQL_ID:SQL语句的唯一标识符。
SNAP_ID:快照ID,表示采样的时间点。
DBID:数据库ID。
INSTANCE_NUMBER:实例编号。
PLAN_HASH_VALUE:SQL执行计划的哈希值。
2、DBA_HIST_SNAPSHOT
dba_hist_snapshot是Oracle数据库中的动态视图,用于提供有关历史性能快照的信息。它记录了数据库在不同时间点的性能指标和统计数据。dba_hist_snapshot可以用于分析数据库的性能变化和趋势,帮助管理员进行性能监控和故障排查。
常用字段:
SNAP_ID:快照的唯一标识符。
BEGIN_INTERVAL_TIME:快照的开始时间。
END_INTERVAL_TIME:快照的结束时间。
DBID:数据库的唯一标识符。
INSTANCE_NUMBER:实例的编号。
3、v$SQLTEXT
用于提供有关共享SQL区域中SQL语句文本的信息。它记录了数据库中执行过的SQL语句的文本。vsqltext可以用于查看和分析数据库中执行过的SQL语句的具体文本内容。
常用字段:
SQL_ID:SQL语句的唯一标识符。
SQL_TEXT:SQL语句的文本。
4、v$SQL⭐
用于提供有关SQL语句执行的统计信息和执行计划
SQL_TEXT:SQL语句的文本,最多1000个字符。
SQL_FULLTEXT:SQL语句的完整文本,以CLOB(Character Large Object)形式存储。SQL_ID:SQL语句的唯一标识符,最多13个字符。
SHARABLE_MEM:共享内存的大小,以字节为单位。
PERSISTENT_MEM:持久内存的大小,以字节为单位。
RUNTIME_MEM:运行时内存的大小,以字节为单位。
SORTS:排序操作的次数。
EXECUTIONS:SQL语句的执行次数。
PARSE_CALLS:解析调用的次数。
DISK_READS:磁盘读取的次数。
DIRECT_WRITES:直接写入的次数。
DIRECT_READS:直接读取的次数。
BUFFER_GETS:缓冲区获取的次数。
APPLICATION_WAIT_TIME:应用程序等待的时间。
CONCURRENCY_WAIT_TIME:并发等待的时间。
CLUSTER_WAIT_TIME:集群等待的时间。
USER_IO_WAIT_TIME:用户I/O等待的时间。
PLSQL_EXEC_TIME:PL/SQL执行的时间。
JAVA_EXEC_TIME:Java执行的时间。
ROWS_PROCESSED:处理的行数。
COMMAND_TYPE:命令类型的编号。
OPTIMIZER_MODE:优化器模式。
OPTIMIZER_COST:优化器成本。
OPTIMIZER_ENV:优化器环境。
三、SQL语句
将这两个视图通过快照 id join一下得到SQL,记录了系统七天内Oracle数据库的SQL执行次数
1、七天内Oracle数据库的SQL执行次数
SELECT
SUM(ss.executions_delta) AS total_executions
FROM
DBA_HIST_SQLSTAT ss
JOIN
DBA_HIST_SNAPSHOT sn ON ss.snap_id = sn.snap_id
WHERE
sn.begin_interval_time BETWEEN SYSDATE - 7 AND SYSDATE;
--结果
TOTAL_EXECUTIONS
----------------
122282