原 在Oracle中,如何清除Shared Pool中某条SQL语句?
Tags: Oracle原创Shared Pool游标清除
如果数据库版本为Oracle 10.2.0.4以前,那么只能清空整个Shared Pool,命令为:“ALTER SYSTEM FLUSH SHARED_POOL;
”。在生产库上,该句要慎用。
而从Oracle 10.2.0.4开始提供了一个包DBMS_SHARED_POOL,该包可以实现清除Shared Pool中某条SQL语句的功能。若该包没有安装,则可以通过$ORACLE_HOME/rdbms/admin/dbmspool.sql
进行安装。
使用这种方法可以精确的将一个SQL从共享池中删除,从而使得Oracle为这个SQL重新生成执行计划。这种方法只针对单个SQL语句,使得解决问题的同时不会造成任何的误伤。
示例如下:
1 2 3 4 5 6 7 8 9 | SYS@lhrdb> SELECT ADDRESS,HASH_VALUE FROM V$SQLAREA WHERE ROWNUM<=1; ADDRESS HASH_VALUE ---------------- ---------- 0000000092D263D0 3231842444 SYS@lhrdb> EXEC DBMS_SHARED_POOL.PURGE('0000000092D263D0,3231842444','C'); -- 这里的C表示游标(Cursor) PL/SQL procedure successfully completed. SYS@lhrdb> SELECT ADDRESS,HASH_VALUE,SQL_TEXT FROM V$SQLAREA WHERE ADDRESS='0000000092D263D0' AND HASH_VALUE='3231842444'; no rows selected |