题目部分
【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,活动会话历史信息)每秒从VSESSION中取ACTIVE状态会话的信息,存储在VACTIVE_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秒。
SYS@lhrdb> set pagesize 9999
SYS@lhrdb> set line 9999
SYS@lhrdb> col NAME format a40
SYS@lhrdb> col KSPPDESC format a50
SYS@lhrdb> col KSPPSTVL format a20
SYS@lhrdb> SELECT a.INDX,
2 a.KSPPINM NAME,
3 a.KSPPDESC,
4 b.KSPPSTVL
5 FROM x$ksppi a,
6 x$ksppcv b
7 WHERE a.INDX = b.INDX
8 and lower(a.KSPPINM) like lower('%¶meter%');
Enter value for parameter: _ash_enable
old 8: and lower(a.KSPPINM) like lower('%¶meter%')
new 8: and lower(a.KSPPINM) like lower('%_ash_enable%')
INDX NAME KSPPDESC KSPPSTVL
---------- ---------------------------------------- -------------------------------------------------- --------------------
2840 _ash_enable To enable or disable Active Session sampling and f TRUE
lushing
SYS@lhrdb> /
Enter value for parameter: _ash_sampling_interval
old 8: and lower(a.KSPPINM) like lower('%¶meter%')
new 8: and lower(a.KSPPINM) like lower('%_ash_sampling_interval%')
INDX NAME KSPPDESC KSPPSTVL
---------- ---------------------------------------- -------------------------------------------------- --------------------
2838 _ash_sampling_interval Time interval between two successive Active Sessio 1000
n samples in millisecs
1000毫秒,正好是1秒的时间。
众所周知,动态性能视图实质是Oracle自行构造的一堆存在于SGA内存区的虚表,也就是说,ASH的数据是保存在内存里的,实际上,Oracle分配给ASH的空间并不是无限大,ASH buffers的最小值为1MB,最大值不超过30MB。ASH占用的SGA内存大小可以通过如下SQL查询:
SYS@lhrdb> SELECT * FROM V$SGASTAT WHERE NAME LIKE '%ASH buffers%';
POOL NAME BYTES
------------ ---------------------------------------- ----------
shared pool ASH buffers 16777216
可以看到这里分配了大约16M大小的内存。
直白地讲,VACTIVE_SESSION_HISTORY中能够记录多少会话信息,一方面取决于该数据库的SGA分配给ASH buffers的大小,另一方面取决于数据库的启动和关闭(重启数据库时将重构SGA内存区)。这两方面的因素制约了VACTIVE_SESSION_HISTORY中能够保存的会话信息的能力。作为一名DBA,肯定是希望ASH尽可能多地保留关于会话的信息,但目前来看,单纯依靠V
本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗