什么时候 shared pool 里面的 shared sql area 被 清除flush ?
几种情况:
1. 相关表 ,cluster , index 等,跟对象相关的, 执行过analyze 语句后,oracle会清除原来的缓存。
2. 相关对象被修改过,那么这个sql area 就变成无效状态,下一次读的时候会重新解析reparse
3. 数据库global database name 被修改过
4.执行alter system flush shared_pool 的时候。
就是这几种情况下, 执行计划(还有其他的信息) 都会被刷新。
上面这几种情况参考 oracle concept 第8章。
根据上面的几种情况,我们可以选择ANALYZE相关对象,修改相关对象来清除相关对象的执行计划。
另外10G以后的数据库可以通过dbms_shared_pool.purge('address,hash','C',1)清除指定的游标对象,1是清除V$SQLAREA和V$SQL中的记录。