我写的SQL调优专栏:https://blog.csdn.net/u014427391/article/category/8679315
整体分析调优工具
- AWR:关注数据库的整体性能的报告;
- ASH:数据库中的等待事件与哪些SQL具体对应的报告;
- ADDM:oracle给出的一些建议
- AWRDD:Oracle针对不同时段的性能对比报告
- AWRSQRPT:oracle获取统计信息与执行计划
不同场景对应工具
局部分析调优工具:
- explain plan for
- set autotrace on
- statistics_level=all
- 直接通过sql_id获取
- 10046 trace
- awrrpt.sql
整体性能工具要点
- AWR关注点:load profile、efficiency percentages、top 5 time events、SQL Statistics、segment_statistics
- ASH关注点:等待事件与sql完美结合
- ADDM:各种建议与对应SQL
- AWRDD:不同时期 load profile的比较、不同时期等待事件的比较、不同时期TOP SQL的比较
- AWRSQRPT:获取与关注点(统计信息与执行计划)
select output from table (dbms_workload_repository.awr_report_html(v_dbid,v_instance_number,v_min_snap_id,v_max_snap_id));
相关查询试图:
- v$session (当前正在发生)
- v$session_wait(当前正在等待)
- v$session_wait_history (会话最近的10次等待事件)
- v$active_session_history (内存中的ASH采集信息,理论为1小时)
- wrh$_active_session_history (写入AWR库中的ASH信息,理论为1小时以上)
- dba_hist_active_sess_history (根据wrh$_active_session_history生成的视图)
对于局部的,比如某个页面列表sql,我们可以使用Oracle的执行计划进行sql调优,但是对于整个系统来说,你可以知道哪些sql比较耗时?当然可以通过查Oracle的共享池得到,不过Oracle系统本身就提供了几种性能分析报告,比如AWR、ASH、ADDM等等报告,本博客介绍一下ASH性能分析报告
ASH即活动会话历史,Active Session History,ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件。不活动的会话不会采样, 采样工作由新引入的后台进程MMNL完成。
vactive_session_history视图提供了在实例级别抽取会话活动信息。活动会话每分钟会被抽样一次且被存储在sga中的循环缓冲区中。任何被连接到数据库且正等待一个不属于空闲等待时间的会话会被考虑是一个活动的会话。每个会话抽样都是一组行数据且通过vactive_session_history视图来返回每个被抽样活动会话的行数据,返回最新被抽样会话的第一行数据。
一、ASH报告生成
继上一篇AWR方面的博客之后,https://smilenicky.blog.csdn.net/article/details/89414432,我再写一篇ASH方面的博客:
1.1 工具选择
对于Oracle数据库可以使用sqlplus或者plsql developer客户端软件 sqlplus 使用 可以使用sqlplus工具登录 进入数据库
代码语言:javascript复制sqlplus / as sysdba
查看用户
代码语言:javascript复制show parameter db_name
用登录之后才可以使用 plsql developer使用 plsql developer也可以使用,登录之后,选择文件(File)->新建(New)->命令窗口(Command Window)
1.2 自动创建快照
开始压测后执行
代码语言:javascript复制exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();
可以通过dba_hist_wr_control查看当前的配置情况,当前awr为每1小时做一次数据快照,保留时间为8天。
代码语言:javascript复制 select * from dba_hist_wr_control;
修改配置,每隔30分钟收集一次,保存1天
代码语言:javascript复制execute dbms_workload_repository.modify_snapshot_settings(interval=>30,retention=>14000);
关闭自动收集
代码语言:javascript复制SQL>exec dbms_workload_repository.modify_snapshot_settings (interval=>0,retention=>24*60);
1.3 手工创建快照
除了自动创建快照,也可以手工创建快照
代码语言:javascript复制select dbms_workload_repository.create_snapshot() from dual;
1.4 ASH报告生成
对于sqlplus客户端的可以使用
代码语言:javascript复制@?/rdbms/admin/ashrpt.sql
对于plsql客户端,我用绝对路径去执行,@?的命令找不到文件 这个要根据自己的Oracle安装路径去修改,例如:
代码语言:javascript复制 @D:/oracle/product/11.1.0/db_1/RDBMS/ADMIN/ashrpt.sql
(1)日志报告类型
Enter value for report_type: text
选择生成的ASH 报告类型,是text 还是html,一般选择html
(2)日志报告起始时间
Enter value for begin_time: 04/18/1920:00:00
输入ASH 开始的时间,时间格式上面的示例有说明,比如我这里是2019年4月18日晚上20:00:00开始。
(3)日志报告结束时间
Enter value for duration:15
输入ASH 结束时间,默认是SYSDATE - begin_time,一般输入,一般默认是秒或者分组,拿出15分组的ash分析日志来。
(4) ASH报告名称 Enter value of report name:ash20190420 输入ASH报告名称,可以随意填,非生产,报告名称,打印的日志后面可以找到报告存放路径,比如:
代码语言:javascript复制D:oracleproduct11.2.0dbhome_1RDBMSADMINash.html
SQL> @D:/oracle/product/11.1.0/db_1/RDBMS/ADMIN/ashrpt.sql
Current Instance
~~~~~~~~~~~~~~~~
DBID DB_NAME INST_ INST_NAME
---------- ------------ ----- ------------
1525762377 ORCL 1 orcl
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Enter 'html' for an HTML report, or 'text' for plain text
Defaults to 'html'
Type Specified: html
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DBBID INSTT DBB_NAME INSTT_NAME HOST
------------ ----- ------------ ------------ ------------
* 1525762377 1 ORCL orcl PC-201508171
906
Defaults to current database
Using database id: 1525762377
Enter instance numbers. Enter 'ALL' for all instances in a
RAC cluster or explicitly specify list of instances (e.g., 1,2,3).
Defaults to current instance.
Using instance number(s): 1
PL/SQL procedure successfully completed
...
0
PL/SQL procedure successfully completed
...
18-Apr-19 22:05:54
ASH Samples in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Oldest ASH sample available: 09-Apr-19 22:00:36 [ 12968 mins in the past] Latest ASH sample available: 18-Apr-19 22:05:54 [ 3 mins in the past]
...
18-Apr-19 22:05:54
Specify the timeframe to generate the ASH report
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter begin time for report:
-- Valid input formats:
-- To specify absolute begin time:
-- [MM/DD[/YY]] HH24:MI[:SS]
-- Examples: 02/23/03 14:30:15
-- 02/23 14:30:15
-- 14:30:15
-- 14:30
-- To specify relative begin time: (start with '-' sign)
-- -[HH24:]MI
-- Examples: -1:15 (SYSDATE - 1 Hr 15 Mins)
-- -25 (SYSDATE - 25 Mins)
Defaults to -15 mins
Report begin time specified: 04/18/1920:00:00
PL/SQL procedure successfully completed
18-Apr-20 00:00:00
Enter duration in minutes starting from begin time:
Defaults to SYSDATE - begin_time
Press Enter to analyze till current time
Report duration specified: 7200
PL/SQL procedure successfully completed
...
23-Apr-20 00:00:00
Specify Slot Width (using ashrpti.sql) for 'Activity Over Time' section
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Explanation:
-- In the 'Activity Over Time' section of the ASH report,
-- the analysis period is divided into smaller slots
-- and top wait events are reported in each of those slots.
-- Default:
-- The analysis period will be automatically split upto 10 slots
-- complying to a minimum slot width of
-- 1 minute, if the source is V$ACTIVE_SESSION_HISTORY or
-- 5 minutes, if the source is DBA_HIST_ACTIVE_SESS_HISTORY.
Specify Slot Width in seconds to use in the 'Activity Over Time' section:
Defaults to a value as explained above:
Slot Width specified:
Specify Report Targets (using ashrpti.sql) to generate the ASH report
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Explanation:
-- ASH Report can accept "Report Targets",
-- like a particular SQL statement, or a particular SESSION,
-- to generate the report on. If one or more report targets are
-- specified, then the data used to generate the report will only be
-- the ASH samples that pertain to ALL the specified report targets.
-- Default:
-- If none of the report targets are specified,
-- then the target defaults to all activity in the database instance.
Specify SESSION_ID (eg: from V$SESSION.SID) report target:
Defaults to NULL:
SESSION report target specified:
Specify SQL_ID (eg: from V$SQL.SQL_ID) report target:
Defaults to NULL: (% and _ wildcards allowed)
SQL report target specified:
Specify WAIT_CLASS name (eg: from V$EVENT_NAME.WAIT_CLASS) report target:
[Enter 'CPU' to investigate CPU usage]
Defaults to NULL: (% and _ wildcards allowed)
WAIT_CLASS report target specified:
Specify SERVICE_HASH (eg: from V$ACTIVE_SERVICES.NAME_HASH) report target:
Defaults to NULL:
SERVICE report target specified:
Specify MODULE name (eg: from V$SESSION.MODULE) report target:
Defaults to NULL: (% and _ wildcards allowed)
MODULE report target specified:
Specify ACTION name (eg: from V$SESSION.ACTION) report target:
Defaults to NULL: (% and _ wildcards allowed)
ACTION report target specified:
Specify CLIENT_ID (eg: from V$SESSION.CLIENT_IDENTIFIER) report target:
Defaults to NULL: (% and _ wildcards allowed)
CLIENT_ID report target specified:
Specify PLSQL_ENTRY name (eg: "SYS.DBMS_LOB.*") report target:
Defaults to NULL: (% and _ wildcards allowed)
PLSQL_ENTRY report target specified:
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is ashrpt_1_0423_0000.html. To use this name,
press <return> to continue, otherwise enter an alternative.
Using the report name ash.html
Summary of All User Input ------------------------- Format : HTML DB Id : 1525762377 Inst num : 1 Begin time : 18-Apr-20 00:00:00 End time : 23-Apr-20 00:00:00 Slot width : Default Report targets : 0 Report name : ash.html
...
23-Apr-20 00:00:00
Started spooling to D:oracleproduct11.2.0dbhome_1RDBMSADMINash.html
遇到问题:假如执行命令遇到:ORA-01843:无效月份报错,就可以执行下面sql
代码语言:javascript复制ALTER SESSION SET NLS_LANGUAGE=American;
alter session set NLS_DATE_FORMAT='DD-MON-YY';
二、ASH报告指标分析
ASH报告就非常直接了,直接给出等待事件和哪些SQL关联,然后我们就可以拿SQL去调优了
图来自《收获,不止SQL优化》一书