当前位置:Gxlcms > 数据库问题 > 如何清除某条SQL的执行计划

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

时间:2021-07-01 10:21:17 帮助过:2人阅读

如果遇到绑定窥探导致执行计划慢的情况,想要清除某条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处理

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

标签:

人气教程排行