为什么有的Oracle的执行计划不在AWR中
为什么我的执行计划不在AWR中呢?本文是Why my execution plan is not in AWR?[1]的翻译,如有翻译不对或翻译不当的地方,敬请指出不足。
前一周,我参加“使用AWR报告诊断 Oracle RAC 性能”的网络研讨会时关注到一个问题,有很多人提出了一个问题,为什么他们的SQL_ID存在于dba_hist_active_sess_history (AWR) 中,但他们却无法通过SQL_ID从AWR中获取其相应的执行计划。这是在短短几个月内,我第三次看到有人提出这个了问题。现在是时候回答这个问题了。
为了回答这个问题,我们需要知道 dba_hist_active_sess_history 是从gv$active_session_history (ASH) 获取/采集数据,而 dba_hist_sqlstat 和 cie 从一堆其他动态性能视图中(如 v$sql、v$version 等)获取数据。
在这种情况下,标记为复制到AWR中的行(记录)从 gv$active_session_history 转储到 dba_hist_active_sess_history 中,当然不是真正即时转储,而是具有相对较小的时间延迟,我无法计算具体值。然而,剩余/其它的动态性能视图(v$sql、v$session 等)仅在 AWR 采样时间(通常默认为每小时,跟AWR的设置有关系)转储到 AWR 历史表(dba_hist_sqlstat 等)中。
此外,你知道 Oracle不会像处理v$active_session_history那样,将v$sql、v$session 和其他性能动态视图的数据转储到AWR中(flushing data)。ASH中刷新数据的频率很大程度上取决于_ash_size参数值定义的大小
1 2 3 4 5 6 | SQL> @pd _ash_size Show all parameters and session values from x$ksppi/x$ksppcv... NAME VALUE DESCRIPTION ---------- --------- ------------------------------------------------------------- _ash_size 1048618 To set the size of the in-memory Active Session History buffers |
当然,它这还取决于ASH 承受的压力有多大,什么情况下刷出数据。
1 2 3 4 5 6 7 8 9 | SQL> select inst_id ,total_size/power(1024,2) MB ,awr_flush_emergency_count from gv$ash_info; 2 3 4 5 INST_ID MB AWR_FLUSH_EMERGENCY_COUNT ---------- ---------- ------------------------- 1 4 0 |