MVIEW引起ORA-04031
有一个数据库报了ORA-04031错误, 等我们上去看时, 却是好的, 通过查询Statspack有关视图, 发现Shared Pool Free Memory在这之前是逐渐减少的, sql area部分占得很大. 可能的原因是, 当Oracle遇到这个错误后, 自动做了一次Flush Pool操作. 于是写了一段程序去跟踪SQL占用的内存, 发现有两个SQL语句很不正常, 版本数很多, 占用的内存也很大, 差不多占了一半的sql area.
ASQL> ora share
ADDRESS CHILDS BYTES
---------------- ------ ---------
0000040000A328F8 1026 215577124
000004000F7AB058 1026 215503530
来看一下这两个SQL语句是什么?
ASQL> ora sql 0000040000A328F8
update sys.sumpartlog$ s set s.timestamp = :1, s.scn = :2
where rowid in (select rowid from sumpartlog$ AS OF SNAPSHOT(:3) s1
where s1.bo# = :4 and s1.timestamp >=
to_date('4000-01-01:00:00:00','YYYY-MM-DD:HH24:MI:SS'))
ASQL> ora sql 000004000F7AB058
update sys.sumdelta$ s set s.timestamp = :1, s.scn = :2
where rowid in (select rowid from sys.sumdelta$ AS OF SNAPSHOT (:3) s1
where s1.tableobj# = :4 and s1.timestamp >=
to_date('4000-01-01:00:00:00','YYYY-MM-DD:HH24:MI:SS'))
很明显这不是我们系统中的SQL语句, 因具只好搜索Metalink了, 找到这两个表和实体化视图的On Commit刷新有关. 进一步查这些SQL语句不能共享的原因, 发现都是FLASHBACK CURSOR这一列为Y. 进一步搜索Metalink, 终于找到原因了, 是Bug 6010070. 现在还没有办法解决, Oracle明确没有说哪个版本已解决. 只要不用On Commit刷新就行了.
