发现一个导致Oracle自己的低效SQL,在AWR报告中占用较大的资源。
这个SQL在Elapsed Time、CPU Time、User I/O Wait Time、Buffer Gets、Physical Reads都会出现,其SQL模块是Oracle Enterprise Manager.Metric Engine。显然这是一个OEM自己的SQL,检查完整SQL语句:
<pre lang=’SQL’>SELECT TO_CHAR(current_timestamp AT TIME ZONE ‘GMT’, ‘YYYY-MM-DD
HH24:MI:SS TZD’) AS curr_timestamp, COUNT(username) AS failed_count FROM
sys.dba_audit_session WHERE returncode != 0 AND TO_CHAR(timestamp, ‘YYYY-MM-DD
HH24:MI:SS’) >= TO_CHAR(current_timestamp – TO_DSINTERVAL(‘0 0:30:00’),
‘YYYY-MM-DD HH24:MI:SS’)</pre>
这个检查DBA_AUDIT_SESSION的SQL语句写法很烂,以致于一开始我还不太相信是出自Oracle,不过Oracle Enterprise Manager.Metric Engine的MODULE
NAME已经说明了问题,Oracle居然自己违反对列进行操作以及不必要的转换原则。
此外,这个SQL基本上没有办法使用索引,如果DBA_AUDIT_SESSION中记录很多,那么这个SQL会非常耗时,这就是不算是OEM的bug,至少也是一种设计缺陷。