♣题目 部分
【DB笔试面试817】在Oracle中,什么是ASH?
♣答案部分
ASH(Active Session History,活动会话历史信息)、AWR(Automatic Workload Repository,自动负载信息库)、ADDM(Automatic Database Diagnostic Monitor,数据库自动诊断监视工具)是Oracle性能调整的三把利剑,需要深入地了解,但是面试一般都问得比较简单,主要问到的是AWR。
Oracle性能调整最重要的就是对最影响性能的SQL的调整。在一个应用中,能够影响到数据库的只有SQL,也只能是SQL。系统不能一味地依靠增强硬件、修改系统、数据库参数来提高数据库的性能,更多的应该关注那些最影响性能的SQL语句。ASH报告、AWR报告和ADDM报告都是能够找出影响性能SQL的工具。在分析ASH报告、AWR报告和ADDM报告的时候,最重要的工作就是找出对性能影响最大的SQL语句,并对其进行优化。
ASH(Active Session History,活动会话历史信息)每秒从V$SESSION中取ACTIVE状态会话的信息,存储在V$ACTIVE_SESSION_HISTORY中,并收集所有活动会话的等待信息,不活动的会话不会采样。这里的活动会话包含2类情况,一类是非空闲等待事件(WAIT_CLASS <> 'Idle'),一类是“ON CPU”状态的会话。采样工作由新引入的后台进程MMNL(Manageability Monitor Lite Process)来完成。若ASH数据被刷新到磁盘,则需要从DBA_HIST_ACTIVE_SESS_HISTORY视图中查询相关信息。
是否启用ASH功能,受一个隐含参数“_ASH_ENABLE”的控制,默认为TRUE。而采样时间同样由另一个隐含参数“_ASH_SAMPLING_INTERVAL”决定,默认为1000毫秒,即1秒。
1SYS@lhrdb> set pagesize 9999
2SYS@lhrdb> set line 9999
3SYS@lhrdb> col NAME format a40
4SYS@lhrdb> col KSPPDESC format a50
5SYS@lhrdb> col KSPPSTVL format a20
6SYS@lhrdb> SELECT a.INDX,
7 2 a.KSPPINM NAME,
8 3 a.KSPPDESC,
9 4 b.KSPPSTVL
10 5 FROM x$ksppi a,
11 6 x$ksppcv b
12 7 WHERE a.INDX = b.INDX
13 8 and lower(a.KSPPINM) like lower('%¶meter%');
14Enter value for parameter: _ash_enable
15old 8: and lower(a.KSPPINM) like lower('%¶meter%')
16new 8: and lower(a.KSPPINM) like lower('%_ash_enable%')
17
18 INDX NAME KSPPDESC KSPPSTVL
19---------- ---------------------------------------- -------------------------------------------------- --------------------
20 2840 _ash_enable To enable or disable Active Session sampling and f TRUE
21 lushing
22SYS@lhrdb> /
23Enter value for parameter: _ash_sampling_interval
24old 8: and lower(a.KSPPINM) like lower('%¶meter%')
25new 8: and lower(a.KSPPINM) like lower('%_ash_sampling_interval%')
26 INDX NAME KSPPDESC KSPPSTVL
27---------- ---------------------------------------- -------------------------------------------------- --------------------
28 2838 _ash_sampling_interval Time interval between two successive Active Sessio 1000
29 n samples in millisecs
1000毫秒,正好是1秒的时间。
众所周知,动态性能视图实质是Oracle自行构造的一堆存在于SGA内存区的虚表,也就是说,ASH的数据是保存在内存里的,实际上,Oracle分配给ASH的空间并不是无限大,ASH buffers的最小值为1MB,最大值不超过30MB。ASH占用的SGA内存大小可以通过如下SQL查询:
1SYS@lhrdb> SELECT * FROM V$SGASTAT WHERE NAME LIKE '%ASH buffers%';
2POOL NAME BYTES
3------------ ---------------------------------------- ----------
4shared pool ASH buffers 16777216
可以看到这里分配了大约16M大小的内存。
直白地讲,V$ACTIVE_SESSION_HISTORY中能够记录多少会话信息,一方面取决于该数据库的SGA分配给ASH buffers的大小,另一方面取决于数据库的启动和关闭(重启数据库时将重构SGA内存区)。这两方面的因素制约了V$ACTIVE_SESSION_HISTORY中能够保存的会话信息的能力。作为一名DBA,肯定是希望ASH尽可能多地保留关于会话的信息,但目前来看,单纯依靠V$ACTIVE_SESSION_HISTORY肯定无法实现这个目标,有什么更好的方法呢?Oracle又提供了AWR特性,ASH收集到的会话信息,是作为AWR中快照信息的一部分,被保存到了硬盘上。