以下转自:http://blog.csdn.net/tianlesoftware/article/details/6448765
作者:Dave
分类: Oracle Performance 2011-05-26 23:24 7168人阅读 评论(0) 收藏 举报 session oracle report parallel file database在Oracle 10g中,推出了一些与DB 性能相关的功能,比如AWR, ADDM, STA, 已经这篇讲的ASH(Active Session History)。
关于其他的几个功能说明,参考我之前的Blog:
Oracle AWR 介绍
http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4682300.aspx
Oracle ADDM 自动诊断监视工具介绍
http://blog.csdn.net/tianlesoftware/archive/2010/05/28/5630942.aspx
如何用 SQL Tuning Advisor (STA) 优化SQL语句
http://blog.csdn.net/tianlesoftware/archive/2010/05/28/5630888.aspx
一.官网说明
Performance tuning and problem diagnosis are the two most challenging and important management tasks that any database administrator performs. In line with the primary drive of the server manageability effort, the Autometic Database Diagnostic Monitor (ADDM) attempts to make, performing these two tasks, a lot simpler and easier. ADDM employs an iterative top-down approach and drives a rule-based expert system, to identify bottlenecks in a system and suggest relevant recommendations to tackle them.
ASH acquires the information it requires to sample the active session’s activity from the database kernel’s session state objects. The quantity of information sampled by ASH could be quite voluminous, and therefore, ASH maintains a fixed sized circular buffer in the database System Global Area (SGA). The fixed sized circular buffer will be allocated during database start-up time. Since the information collected by the ASH infrastructure compliments the information present in SWRF snapshots, and can be used for drilldown purposes during problem diagnosis or performance tuning, the ASH data is also periodically flushed to disk.
-- ASH 的数据也会定期的写入磁盘
The flushing and purging policies of ASH, including the way ASH respects SWRF baselines, are completely tied with SWRF policies. Still, flushing the entire content of ASH on to disk could be too populous to be feasible, and therefore, only one out of every ten active session samples will be flushed to disk.
-- 将整个ASH 内容频繁的写入磁盘不容易,所以只有1/10的active session 数据写入磁盘
In addition to ADDM using the ASH to achieve its objectives, the ASH contents will also be displayed in the Oracle Enterprise Manager (EM) / Mozart [OEM-SWRF] performance screen. The graph that summarizes the ASH contents in the EM performance screen will be a stacked graph showing the distribution of the elapsed database time onto various wait times and CPU time, during every minute. The ASH infrastructure will provide a single V$ view (V$ACTIVE_SESSION_HISTORY), to view the in-memory contents of ASH.
--可以通过V$ACTIVE_SESSION_HISTORY 视图查看内存中ASH 的信息
The ASH infrastructure will also provide a way to dump the in-memory contents of its circular buffer onto an external file in a human readable format. The ASH dump file can be transported to another system, imported onto a user table, and analyzed using the ADDM in that system.
-- 也可以将内存中的ASM 数据dump 到外部文件,并转移到其他系统进行分析。
ASH Memory Size
==============
Size of ASH Circular Buffer = Max [Min [ #CPUs * 2 MB, 5% of Shared Pool Size, 30MB ], 1MB ]
--最小1M,最大30M
Catagoreising the Active Session
============================
i. Present inside a user call
ii. Not a recursive session
iii. Not waiting for the ‘IDLE’ wait-event
iv. If it is a background process, not waiting for its usual timer-event
v. If it is a parallel slave, not waiting for the PX_IDLE wait event.
So will not see any info if a process is waitting for "SQL*Net message from client".
online 和offline 分析示例
Let start with ONLINE analysis
========================
I have open two session. first one (SID 16) is running the DML like
SQL> delete test where rowid='AAAKB9AAEAAAAAiAAA';
From second session (SID 15) run the same DML, and it is obvious that second session will wait for first session to commit.
Lets check the info in V$ACTIVE_SESSION_HISTORY.
------------------------------------------------
Run the following script.
SQL> select SESSION_ID,NAME,P1,P2,P3,WAIT_TIME,CURRENT_OBJ#,CURRENT_FILE#,CURRENT_BLOCK# from v$active_session_history ash, v$event_name enm where ash.event#=enm.event# and SESSION_ID=&SID and SAMPLE_TIME>=(sysdate-&minute/(24*60));
Input is
Enter value for sid: 15
Enter value for minute: 1 /* How many minutes activity you want to see */
output is 59 lines as it is wiatting more than 1 minute more than 1 minute
SESSION_ID NAME P1 P2 P3 WAIT_TIME CURRENT_OBJ# CURRENT_FILE# CURRENT_BLOCK#
---------- ------------------------------ ---------- ---------- ---------- ---------- ------------ ------------- --------------
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
continue .............
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
So you have object details with problem info.
Lets do the OFFLINE analysis of ASH
==============================
So if your are not able to find the problem online, you can dump the ASH to a trace.
Command would be like below: where level means minute. lets dump for 10 minutes history
1. SQL> alter session set events 'immediate trace name ashdump level 10';
or
2. SQL> alter system set events 'immediate trace name ashdump level 10';
or
3. SQL> oradebug setmypid
SQL> oradebug dump ashdump 10;
So you will get the trace file in udump.
Output of trace would be like
<<>>
2594829169,1,161390,"07-18-2003 16:05:21.098717000",13,1,0,"",65535,0,0,2,0,0,0,4294967295,0,0,2,35,100,0,0,10
05855,0,"oracle@usunrat21 (MMNL)","","",""
Oracle has provide an utility under $ORACLE_HOME/rdbms/demo (Location may change), by which you can upload the ASH trace dump to a database table and do the analysis.
Please see the following Note
Note 555303.1 ashdump* scripts and post-load processing of MMNL traces
for the scripts.
Script Details
============
1. "ashdump_loader" -> Main script to run with one argument. Argument is the the name of tracefile. (available in 10g only)
2. "ashdump_table.sql" -> It would be called by the main script to create the table
called SYSTEM.ACTIVE_SESSION_HISTORY_DUMP.
3. "ashdump_sqlldr.ctl" -> It is the third script called by main script to load the trace into
table called SYSTEM.ACTIVE_SESSION_HISTORY_DUMP.
注意:You must use the same oracle version to compare the OFFLINE trace with the other view.
二.ASH 说明
ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件。不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成。
ASH buffers 的最小值为1MB,最大值不超过30MB。内存中记录数据。期望值是记录一小时的内容。
ASH报告生成脚本:@?/rdbms/admin/ashrpt.sql
ASH内存记录数据始终是有限的,为了保存历史数据,引入了自动负载信息库(Automatic Workload Repository ,AWR) 由后台进程MMON完成。ASH信息同样被采集写出到AWR负载库中。由于内存不是足够的,所以MMNL进程在ASH写满后会将信息写出到AWR负载库中。ASH全部写出是不可接受的,所以一般只写入收集的10%的数据量,而且使用direct-path insert完成,尽量减少日志的生成,从而最小化数据库性能影响。
内存中的ASH 信息可以通过V$ACTIVE_SESSION_HISTORY查询,而写出到AWR负载库的ASH信息,可以通过AWR的基础表wrh$active_session_hist查询,wrh$active_session_hist是一个分区表,Oracle会自动进行数据清理。
一般来说,我们在监控数据库时,如果是当前正在发生的问题,我们可以通过v$session+v$sqlarea来找出性能最差的SQL语句。如果在一个小时以内发生的我们可以通过生成ASH报告来找出SQL。如果是1小时以上或几天我们可以通过AWR报告来找出几小时,几天以来最影响系统的SQL语句。ADDM报告基于AWR库,默认可以保存30天的ADDM报告。
相关查询试图:
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生成的视图)
三. ASH 报告生成示例
ASH组件以v$active_session_history视图为基础,生成ASH报表,ASH报表与statspack类似,可以提供以下信息:
Top User Events
Top Background Events
Top Event P1/P2/P3 Values
Top Service/Module
Top Client IDs
Top SQL Command Types
Top SQL using literals
Top Blocking Sessions
Top DB Objects
Top DB Files
Top Latches
Activity Over Time
报表间隔时间可以精确到分钟,因而ASH可以提供比STATSPACK或AWR更详细的关于历史会话的信息,可以作为statspack或awr的补充。ASH报告通过@$ORACLE_HOME/rdbms/admin/ashrpt.sql脚本生成,包括hmtl和text两种格式。
SYS@anqing1(rac1)> @?/rdbms/admin/ashrpt.sql;
-- 调用脚本
Current Instance
~~~~~~~~~~~~~~~~
DB IdDB NameInst Num Instance
----------- ------------ -------- ------------
715014091 ANQING1 anqing1
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Enter 'html' for an HTML report, or 'text' for plain text
Defaults to 'html'
Enter value for report_type: text
-- 选择生成的ASH 报告类型,是text 还是html
Type Specified:text
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB IdInst Num DB NameInstanceHost
------------ -------- ------------ ------------ ------------
7150140911 ANQINGanqingsingledb
* 7150140911 ANQINGanqing1rac1
7150140912 ANQINGanqing2rac2
Defaults to current database
Using database id: 715014091
Defaults to current instance
Using instance number: 1
ASH Samples in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Oldest ASH sample available:19-May-11 14:49:59[10585 mins in the past]
Latest ASH sample available:26-May-11 23:14:34[1 mins in the past]
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
Enter value for begin_time: 8:00
-- 输入ASH 开始的时间,时间格式上面的示例有说明
Report begin time specified: 8:00
Enter duration in minutes starting from begin time:
Defaults to SYSDATE - begin_time
Press Enter to analyze till current time
Enter value for duration:
-- 输入ASH 结束时间,默认是SYSDATE - begin_time
Report duration specified:
Using 26-May-11 08:00:00 as report begin time
Using 26-May-11 23:15:12 as report end time
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 WATI_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_0526_2315.txt. To use this name,
press <return> to continue, otherwise enter an alternative.
Enter value for report_name: /u01/daveash.txt
-- 输入ASH 报告的名称,可以指定生成的目录,默认情况是当前登陆sqlplus的目录。这里的扩展最好加上,如果不加扩展名,扩展名会变成lst. 但不影响数据。
Using the report name /u01/daveash.txt
Summary of All User Input
-------------------------
Format: TEXT
DB Id: 715014091
Inst num: 1
Begin time: 26-May-11 08:00:00
End time: 26-May-11 23:15:12
Slot width: Default
Report targets : 0
Report name: /u01/daveash
ASH Report For ANQING/anqing1
DB NameDB IdInstanceInst Num ReleaseRAC Host
------------ ----------- ------------ -------- ----------- --- ------------
ANQING715014091 anqing11 10.2.0.4.0YES rac1
CPUsSGA SizeBuffer Cache Shared PoolASH Buffer Size
---- ------------------ ------------------ ------------------ ------------------
1272M (100%)144M (52.9%)96M (35.3%)2.0M (0.7%)
Analysis Begin Time:26-May-11 08:00:00
Analysis End Time:26-May-11 23:15:12
Elapsed Time:915.2 (mins)
Sample Count:795
Average Active Sessions:0.01
Avg. Active Session per CPU:0.01
Report Target:None specified
Top User EventsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
Avg Active
EventEvent Class% ActivitySessions
----------------------------------- --------------- ---------- ----------
latch freeOther8.550.00
CPU + Wait for CPUCPU7.170.00
log file syncCommit2.260.00
-------------------------------------------------------------
Top Background EventsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
Avg Active
EventEvent Class% ActivitySessions
----------------------------------- --------------- ---------- ----------
control file sequential readSystem I/O36.73 0.01
control file parallel writeSystem I/O28.300.00
log file parallel writeSystem I/O4.910.00
CPU + Wait for CPUCPU3.400.00
db file parallel write System I/O3.400.00
-------------------------------------------------------------
Top Event P1/P2/P3 ValuesDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
Event% EventP1 Value, P2 Value, P3 Value % Activity
------------------------------ ------- ----------------------------- ----------
Parameter 1Parameter 2Parameter 3
-------------------------- -------------------------- --------------------------
control file sequential read36.73"0","11","1"21.01
file#block#blocks
"0","3","1"11.45
"0","4","1"1.64
control file parallel write28.30"2","3","2"28.30
filesblock#requests
latch free8.68"817412680","389","0"8.55
addressnumbertries
log file parallel write4.91"2","2","2"1.13
filesblocksrequests
db file parallel write3.40"1","0","2147483647"3.40
requestsinterrupttimeout
-------------------------------------------------------------
Top Service/ModuleDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
ServiceModule% Activity Action% Action
-------------- ------------------------ ---------- ------------------ ----------
SYS$BACKGROUND UNNAMED80.25 UNNAMED80.25
SYS$USERSUNNAMED9.43 UNNAMED9.43
DBMS_SCHEDULER5.16 MYJOB4.91
1.891.89
racgimon@rac1 (TNS V1-V31.01 UNNAMED1.01
-------------------------------------------------------------
Top Client IDsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
No data exists for this section of the report.
-------------------------------------------------------------
Top SQL Command TypesDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
-> 'Distinct SQLIDs' is the count of the distinct number of SQLIDs
with the given SQL Command Type found over all the ASH samples
in the analysis period
DistinctAvg Active
SQL Command TypeSQLIDs % ActivitySessions
---------------------------------------- ---------- ---------- ----------
SELECT71.380.00
-------------------------------------------------------------
Top SQL StatementsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
SQL IDPlanhash % Activity Event% Event
------------- ----------- ---------- ------------------------------ ----------
4gd6b1r53yt88N/A1.38 PX Deq: reap credit0.75
** SQL Text Not Available **
531sc6y5xdd41N/A1.01 SQL*Net break/reset to client0.63
** SQL Text Not Available **
-------------------------------------------------------------
Top SQL using literalsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
No data exists for this section of the report.
-------------------------------------------------------------
Top PL/SQL ProceduresDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
No data exists for this section of the report.
-------------------------------------------------------------
Top SessionsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
-> '# Samples Active' shows the number of ASH samples in which the session
was found waiting for that particular event. The percentage shown
in this column is calculated with respect to wall clock time
and not total database activity.
-> 'XIDs' shows the number of distinct transaction IDs sampled in ASH
when the session was waiting for that particular event
-> For sessions running Parallel Queries, this section will NOT aggregate
the PQ slave activity into the session issuing the PQ. Refer to
the 'Top Sessions running PQs' section for such statistics.
Sid, Serial# % Activity Event% Event
--------------- ---------- ------------------------------ ----------
UserProgram# Samples ActiveXIDs
-------------------- ------------------------------ ------------------ --------
160,1 39.87 control file parallel write28.30
SYSoracle@rac1 (CKPT)225/55K [0%]0
control file sequential read11.45
91/55K [0%]0
167,124.91 control file sequential read22.64
SYSoracle@rac1 (LMON)180/55K [0%]0
CPU + Wait for CPU1.51
12/55K [0%]0
148,235618.55 latch free8.55
SYSoracle@rac1 (J002)68/55K [0%]0
161,14.91 log file parallel write4.91
SYSoracle@rac1 (LGWR)39/55K [0%]0
162,13.40 db file parallel write3.40
SYSoracle@rac1 (DBW0)27/55K [0%]0
-------------------------------------------------------------
Top Blocking SessionsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
-> Blocking session activity percentages are calculated with respect to
waits on enqueues, latches and "buffer busy" only
-> '% Activity' represents the load on the database caused by
a particular blocking session
-> '# Samples Active' shows the number of ASH samples in which the
blocking session was found active.
-> 'XIDs' shows the number of distinct transaction IDs sampled in ASH
when the blocking session was found active.
Blocking Sid % Activity Event Caused% Event
--------------- ---------- ------------------------------ ----------
UserProgram# Samples ActiveXIDs
-------------------- ------------------------------ ------------------ --------
161,12.26 log file sync2.26
SYSoracle@rac1 (LGWR)130/55K [0%]0
-------------------------------------------------------------
Top Sessions running PQsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
No data exists for this section of the report.
-------------------------------------------------------------
Top DB ObjectsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
No data exists for this section of the report.
-------------------------------------------------------------
Top DB FilesDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
No data exists for this section of the report.
-------------------------------------------------------------
Top LatchesDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
Max Sample
Latch% LatchBlocking Sid % ActivityWait secs
------------------------------ ---------- --------------- ---------- ----------
# Waits# Sampled Wts# Sampled Wts# Sampled Wts# Sampled Wts
Sampled< 10ms10ms - 100ms100ms - 1s> 1s
-------------- -------------- -------------- -------------- --------------
latch: JS slv state obj latch8.55Held Shared8.550.000000
00000
-------------------------------------------------------------
Activity Over TimeDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)
-> Analysis period is divided into smaller time slots
-> Top 3 events are reported in each of those slots
-> 'Slot Count' shows the number of ASH samples in that slot
-> 'Event Count' shows the number of ASH samples waiting for
that event in that slot
-> '% Event' is 'Event Count' over all ASH samples in the analysis period
SlotEvent
Slot Time (Duration)Count EventCount % Event
-------------------- -------- ------------------------------ -------- -------
08:00:00(84.0 min)67 control file sequential read273.40
control file parallel write202.52
CPU + Wait for CPU81.01
09:24:00(92.0 min)71 control file sequential read232.89
control file parallel write222.77
CPU + Wait for CPU101.26
10:56:00(92.0 min)64 control file sequential read283.52
control file parallel write222.77
CPU + Wait for CPU40.50
12:28:00(92.0 min)66 control file sequential read293.65
control file parallel write212.64
CPU + Wait for CPU111.38
14:00:00(92.0 min)56 control file sequential read303.77
control file parallel write222.77
SQL*Net break/reset to client10.13
15:32:00(92.0 min)77 control file sequential read293.65
control file parallel write222.77
CPU + Wait for CPU151.89
17:04:00(92.0 min)76 control file sequential read354.40
control file parallel write253.14
CPU + Wait for CPU40.50
18:36:00(92.0 min)159 latch free688.55
control file sequential read334.15
control file parallel write222.77
20:08:00(92.0 min)80 control file sequential read334.15
control file parallel write243.02
CPU + Wait for CPU50.63
21:40:00(92.0 min)73 control file sequential read253.14
control file parallel write243.02
CPU + Wait for CPU101.26
23:12:00(3.2 min)6 CPU + Wait for CPU40.50
control file parallel write10.13
log file parallel write10.13
-------------------------------------------------------------
End of Report
Report written to /u01/daveash.txt
SYS@anqing1(rac1)>
这个就是用ashrpt.sql脚本来生成报告,当然也可以使用Toad 来生成,这个也是比较方便的一个工具。