获取数据库30天内各个指标的TOP语句

本文聚焦于从DBA_HIST_SQLSTAT历史数据中提取SQL性能关键指标,包括平均执行时间、CPU时间、缓冲获取次数、解析率、物理读取量、磁盘读取次数、总执行次数和程序执行时间,旨在快速识别一周内性能瓶颈的SQL语句,为数据库优化提供依据。

要查询短时间内的可以从v$sql 或者是v$sqlarea 如果要查询一周或者一个月内 那么有可能在V$SQLAREA里找不到!下面是通过历史DBA_HIST_SQLSTAT里获得, 这个是通过快照方式保留下来的.


--执行时间最长的


WITH  BASTABLE AS 
(  
  SELECT DBMS_LOB.SUBSTR(SQL_TEXT,4000, 1 ) AS SQL_FULL_TEXT,
         DHST.SQL_ID,
         ROUND (X.ELAPSED_TIME / 1000000 / X.EXECUTIONS_DELTA, 3) AVG_ELAPSED_TIME_SEC,
         ROUND (X.CPU_TIME / 1000000 / X.EXECUTIONS_DELTA, 3) AVG_CPU_TIME_SEC, 
         ROUND (X.BUFFER_GETS_DELTA / X.EXECUTIONS_DELTA, 3) AVG_BUFFER_GETS,  
         ROUND (X.PARSE_CALLS_DELTA/X.EXECUTIONS_DELTA*100, 3) EXEC_PARSE_RATE,
         ROUND (X.PHYSICAL_READ_BYTES_DELTA/1024/X.EXECUTIONS_DELTA, 3) AVG_PHYSICAL_READ_KB, 
         ROUND (X.DISK_READS_DELTA / X.EXECUTIONS_DELTA, 3) AVG_DISK_READS,      
         EXECUTIONS_DELTA AS EXEC_TOTAL_NUM,DHST.COMMAND_TYPE,N.COMMAND_NAME        
    FROM DBA_HIST_SQLTEXT DHST, DBA_HIST_SQLCOMMAND_NAME    N,  
         (  
          SELECT DHSS.SQL_ID SQL_ID,
                 SUM (DHSS.CPU_TIME_DELTA) CPU_TIME,   
                 SUM (DHSS.ELAPSED_TIME_DELTA) ELAPSED_TIME,   
                 CASE SUM (DHSS.EXECUTIONS_DELTA) WHEN 0 THEN 1 ELSE SUM (DHSS.EXECUTIONS_DELTA) END AS EXECUTIONS_DELTA,
                 CASE SUM (DHSS.SORTS_DELTA) WHEN 0 THEN 1 ELSE SUM (DHSS.SORTS_DELTA) END AS SORTS_DELTA,     
                 CASE SUM (DHSS.FETCHES_DELTA) WHEN 0 THEN 1 ELSE SUM (DHSS.FETCHES_DELTA) END AS FETCHES_DELTA,
                 CASE SUM (DHSS.PARSE_CALLS_DELTA) WHEN 0 THEN 1 ELSE SUM (DHSS.PARSE_CALLS_DELTA) END AS PARSE_CALLS_DELTA,
                 CASE SUM (DHSS.DISK_READS_DELTA) WHEN 0 THEN 1 ELSE SUM (DHSS.DISK_READS_DELTA) END AS DISK_READS_DELTA,
                 CASE SUM (DHSS.BUFFER_GETS_DELTA) WHEN 0 THEN 1 ELSE SUM (DHSS.BUFFER_GETS_DELTA) END AS BUFFER_GETS_DELTA,
                 CASE SUM (DHSS.IOWAIT_DELTA) WHEN 0 THEN 1 ELSE SUM (DHSS.IOWAIT_DELTA) END AS IOWAIT_DELTA,
                 CASE SUM (DHSS.PHYSICAL_READ_BYTES_DELTA) WHEN 0 THEN 1 ELSE SUM (DHSS.PHYSICAL_READ_BYTES_DELTA) END AS PHYSICAL_READ_BYTES_DELTA                                                                                                                                                                                         
            FROM DBA_HIST_SQLSTAT DHSS 
           WHERE DHSS.SNAP_ID IN   
                (SELECT SNAP_ID   
                   FROM DBA_HIST_SNAPSHOT   
                  WHERE BEGIN_INTERVAL_TIME >= TRUNC(SYSDATE)-30
                    AND END_INTERVAL_TIME <TRUNC(SYSDATE)-0  
                ) 
           AND DHSS.PARSING_SCHEMA_NAME =UPPER('SHARK')                      
          GROUP BY DHSS.SQL_ID
          ) X 
   WHERE X.SQL_ID = DHST.SQL_ID   
     AND DHST.COMMAND_TYPE = N.COMMAND_TYPE 
)
SELECT * FROM 
(
SELECT SQL_FULL_TEXT,SQL_ID,EXEC_TOTAL_NUM, AVG_DISK_READS AS VALUE_S, 'AVG_DISK_READS' AS VALUES_TYPE 
FROM BASTABLE WHERE COMMAND_TYPE<>47  AND SQL_FULL_TEXT NOT LIKE '/* SQL A%' ORDER BY AVG_DISK_READS DESC ) WHERE ROWNUM <=5
UNION ALL 
SELECT * FROM 
(
SELECT SQL_FULL_TEXT,SQL_ID,EXEC_TOTAL_NUM, AVG_ELAPSED_TIME_SEC AS VALUE_S, 'AVG_ELAPSED_TIME_SEC' AS VALUES_TYPE 
FROM BASTABLE WHERE COMMAND_TYPE<>47  AND SQL_FULL_TEXT NOT LIKE '/* SQL A%'  ORDER BY AVG_ELAPSED_TIME_SEC DESC ) WHERE ROWNUM <=5
UNION ALL 
SELECT * FROM 
(
SELECT SQL_FULL_TEXT,SQL_ID,EXEC_TOTAL_NUM, AVG_CPU_TIME_SEC AS VALUE_S, 'AVG_CPU_TIME_SEC' AS VALUES_TYPE 
FROM BASTABLE WHERE COMMAND_TYPE<>47  AND SQL_FULL_TEXT NOT LIKE '/* SQL A%'  ORDER BY AVG_CPU_TIME_SEC DESC ) WHERE ROWNUM <=5
UNION ALL 
SELECT * FROM 
(
SELECT SQL_FULL_TEXT,SQL_ID,EXEC_TOTAL_NUM, AVG_BUFFER_GETS AS VALUE_S, 'AVG_BUFFER_GETS' AS VALUES_TYPE 
FROM BASTABLE WHERE COMMAND_TYPE<>47  AND SQL_FULL_TEXT NOT LIKE '/* SQL A%'  ORDER BY AVG_BUFFER_GETS DESC ) WHERE ROWNUM <=5
UNION ALL 
SELECT * FROM 
(
SELECT SQL_FULL_TEXT,SQL_ID,EXEC_TOTAL_NUM, EXEC_PARSE_RATE AS VALUE_S, 'EXEC_PARSE_RATE' AS VALUES_TYPE 
FROM BASTABLE WHERE COMMAND_TYPE<>47  AND SQL_FULL_TEXT NOT LIKE '/* SQL A%'  ORDER BY EXEC_PARSE_RATE DESC ) WHERE ROWNUM <=5
UNION ALL 
SELECT * FROM 
(
SELECT SQL_FULL_TEXT,SQL_ID,EXEC_TOTAL_NUM, AVG_PHYSICAL_READ_KB AS VALUE_S, 'AVG_PHYSICAL_READ_KB' AS VALUES_TYPE 
FROM BASTABLE WHERE COMMAND_TYPE<>47 ORDER BY AVG_PHYSICAL_READ_KB DESC ) WHERE ROWNUM <=5
UNION ALL 
SELECT * FROM 
(
SELECT SQL_FULL_TEXT,SQL_ID,EXEC_TOTAL_NUM, EXEC_TOTAL_NUM AS VALUE_S, 'EXEC_TOTAL_NUM' AS VALUES_TYPE 
FROM BASTABLE WHERE COMMAND_TYPE<>47  AND SQL_FULL_TEXT NOT LIKE '/* SQL A%'  ORDER BY EXEC_TOTAL_NUM DESC ) WHERE ROWNUM <=5
UNION ALL 
SELECT * FROM 
(
SELECT SQL_FULL_TEXT,SQL_ID,EXEC_TOTAL_NUM, AVG_ELAPSED_TIME_SEC AS VALUE_S, 'PROCEDURES_EXEC_TIME' AS VALUES_TYPE 
FROM BASTABLE WHERE COMMAND_TYPE=47  AND SQL_FULL_TEXT NOT LIKE '/* SQL A%'  ORDER BY AVG_ELAPSED_TIME_SEC DESC ) WHERE ROWNUM <=5;


### 生成和查看 Oracle 数据库的 AWR 报告 Oracle 数据库的 AWR(Automatic Workload Repository,自动工作负载库)报告是用于性能分析的重要工具,能够提供数据库在特定时间段内的资源使用情况和性能统计数据。以下是生成和查看 AWR 报告的详细步骤: #### 1. 使用 SQL*Plus 生成 AWR 报告 通过 SQL*Plus 工具可以调用内置的脚本 `awrrpt.sql` 来生成 AWR 报告。首先,需要以具有 DBA 权限的用户身份登录到数据库。 ```bash sqlplus / as sysdba ``` 登录成功后,执行以下命令调用 AWR 报告生成脚本: ```sql SQL> @?/rdbms/admin/awrrpt.sql ``` 系统会提示输入以下信息: - **报告类型**:选择生成 HTML 或文本格式的报告(默认为文本)。 - **开始快照 ID**(Begin Snapshot ID):输入一个快照的起始 ID。 - **结束快照 ID**(End Snapshot ID):输入一个快照的结束 ID,通常选择与开始 ID 相邻的 ID,例如如果开始 ID 是 100,结束 ID 可以是 101 [^4]。 输入完成后,系统会生成一份详细的 AWR 报告,并显示在 SQL*Plus 窗口中,或者可以选择将报告保存到文件中。 #### 2. 查看 AWR 报告内容 AWR 报告包含多个部分,每个部分提供了不同的性能指标和统计数据。以下是一些关键部分: - **负载概览**(Load Profile):展示数据库的负载情况,包括每秒的事务数、SQL 执行次数等。 - **实例效率百分比**(Instance Efficiency Percentages):显示数据库实例的效率指标,例如缓冲区命中率、共享池命中率等。 - **等待事件**(Top 5 Timed Events):列出影响数据库性能的前五大等待事件,帮助识别性能瓶颈。 - **SQL 统计信息**(SQL Statistics):提供执行时间最长的 SQL 语句列表,有助于优化 SQL 性能。 #### 3. 自动快照管理 AWR 会定期自动采集数据库的性能数据并存储为快照,默认情况下,快照间隔为 60 分钟。可以通过以下查询查看快照信息: ```sql SELECT snap_id, begin_interval_time, end_interval_time FROM dba_hist_snapshot ORDER BY snap_id; ``` 如果需要调整快照的采集间隔,可以使用以下命令: ```sql BEGIN DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS( interval => 30, -- 设置为30分钟 retention => 7*24*60); -- 设置保留时间为7天 END; / ``` #### 4. 其他注意事项 - **权限要求**:生成 AWR 报告需要具有 `DBA` 角色的权限。 - **存储空间**:AWR 快照存储在 SYSAUX 表空间中,需确保该表空间有足够的空间。 - **报告格式**:HTML 格式的报告通常更易于阅读,推荐在分析复杂性能问题时使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值