当一条SQL存在一个不佳的执行计划,想把它删除掉,可以有如下两种方法:
方法一:刷新共享池,所有的SQL都会硬解析
SQL> alter system flush shared_pool;
方法二:指定sql的执行计划 flush
例如:
执行一条示例SQL SQL> select /* mywish1 */ 1 from dual; 1 通过SQL文本查询出SQL对应的 ADDRESS 和 HASH_VALUE,如果已知SQL_ID可以直接用SQL_ID查 SQL> select sql_id, address, hash_value, sql_text from gv$sqlarea
sqlarea where sql_text like '%mywish1%' and sql_text not like '%from
gv$sqlarea%'; SQL_ID ADDRESS HASH_VALUE SQL_TEXT 清除掉 ADDRESS=00000014519560E0,HASH_VALUE=1392289345 的执行计划 SQL> exec SYS.DBMS_SHARED_POOL.PURGE ('00000014519560E0, 1392289345', 'C'); 再次查询该执行计划已经没有了,再次执行就会硬解析生成新的执行计划 SQL> select sql_id, address, hash_value, sql_text from gv$sqlarea
sqlarea where sql_text like '%mywish1%' and sql_text not like '%from
gv$sqlarea%'; no rows selected
----------
1
-------------
------------------- ----------
------------------------------------------------------------------------------
9afvnz59gt9k1 00000014519560E0 1392289345 select /* mywish1 */ 1 from dual
PL/SQL procedure successfully completed.




