My Life My Dream!

守信 求实 好学 力行
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何清除某条SQL的执行计划

Posted on 2015-12-16 18:07  召冠  阅读(1825)  评论(1编辑  收藏  举报

如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法(除非alter system flush shared_pool),只能通过对表ddl使SQL硬解析。现在终于找到了,使用sys.dbms_shared_pool.purge

在11g下可以直接使用,但在10g上需要 alter session set events '5614566 trace name context forever'

 

--特定游标对象

SELECT ADDRESS, HASH_VALUE, EXECUTIONS, PARSE_CALLS
FROM V$SQL
WHERE SQL_ID = '7q9wc51p34my2';

00000007A4E9E040 1781682114 289583 289583

 

ALTER SESSION SET EVENTS '5614566 trace name context forever';

BEGIN
  dbms_shared_pool.purge('00000007A4E9E040,1781682114','C');
END;
/

ALTER SESSION SET EVENTS '5614566 trace name context off';

 

--更新表的统计信息,使相关的游标对象失效
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(OWNNAME          => 'username',
                                TABNAME          => 'tabname',
                                ESTIMATE_PERCENT => 100,
                                METHOD_OPT       => 'for all columns size skewonly',
                                CASCADE          => TRUE,
                                NO_INVALIDATE    => FALSE);  --使相关游标失效

END;
/

 

对于sqlserver

   2008 R2以上版本可以直接使用dbcc命令清除指定计划: DBCC FREEPROCCACHE(plan_handle);

   2005相对也比较麻烦,使用系统存储过程sp_create_plan_guide和sp_control_plan_guide处理