COE:手动指定sql 重新硬解析 (flush cursor out of shared pool)

当我们使用11g 的spm 或者 sql profile,sql patch 固定执行计划后,肯定想让该sql 立即使用新的sql 执行计划;

而大多数情况下,我们都会使用 alter system flush shared pool; 命令来清理整个实例级别的library cache;

对于一个高并发,繁忙 oltp 系统而言,上述操作是一个及其危险的操作;严重时会导致 严重的 shared pool latch ,library cache lock 等争用;

oracle coe team 给出了解决方案:可以一次只刷新了一个sql cursor;

详细操作方法如下:

数据库平台支持: 11g+

相应源包 ?/rdbms/admin/DBMSPOOL.SQL  脚本,生成 DBMS_SHARED_POOL 包;(optional)

----------------------------------------------------------------------------------------------------------

Rem    NAME
Rem      dbmspool.sql - dbms_shared_pool utility package.
Rem    DESCRIPTION
Rem      This package allows you to display the sizes of objects in the
Rem      shared pool, and mark them for keeping or unkeeping in order to
Rem      reduce memory fragmentation.
Rem    RETURNS

REM These scripts are not run by as part of standard database creation.

-----------------------------------------------------------------------------------------------------------------

SPO flush_cursor_&&sql_id..txt;


PRO *** before flush ***
SELECT inst_id, loaded_versions, invalidations, address, hash_value FROM gv$sqlarea WHERE sql_id = '&sql_id.' ORDER BY 1;
SELECT inst_id, child_number, plan_hash_value, executions, is_shareable FROM gv$sql WHERE sql_id = '&sql_id.' ORDER BY 1, 2;


BEGIN

  FOR i IN (SELECT address, hash_value lixora FROM gv$sqlarea WHERE sql_id = '&sql_id.')
  LOOP
    SYS.DBMS_SHARED_POOL.UNKEEP(name => i.address||','||i.lixora, flag => 'C');
    SYS.DBMS_SHARED_POOL.PURGE(name => i.address||','||i.lixora, flag => 'C');
  END LOOP;
END;

/


PRO *** after flush ***
SELECT inst_id, loaded_versions, invalidations, address, hash_value FROM gv$sqlarea  WHERE sql_id = '&sql_id.' ORDER BY 1;

SELECT inst_id, child_number, plan_hash_value, executions, is_shareable FROM gv$sql WHERE sql_id = '&sql_id.' ORDER BY 1, 2;


UNDEF sql_id;

SPO OFF;



猜你喜欢

转载自blog.csdn.net/royjj/article/details/78927061