在Oracle中,如何清除Shared Pool中某条SQL语句?

0    42    1

👉 本文共约714个字,系统预计阅读时间或需3分钟。

如何清除Shared Pool中某条SQL语句?

如果数据库版本为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语句,使得解决问题的同时不会造成任何的误伤。

示例如下:

清除Shared Pool中某条SQL语句无非是让目标SQL语句重新进行硬解析,其实重新进行硬解析的方法还有如下两种:

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

① 使用DDL操作可以让Oracle再次执行目标SQL时使用硬解析(新产生一个子游标),但这种方法的弊端在于其影响范围还是太广了,因为一旦对某个表执行了DDL操作,库缓存中所有在SQL文本中包含了这个表的Shared Cursor都会被Oracle标记为失效(INVALID),这意味着这些Shared Cursor中存储的解析树和执行计划将不再能被重用,再次执行与这个表相关的所有SQL时就会全部使用硬解析。这是很不好的,特别是对于OLTP类型的应用系统而言,这可能会导致短时间内的硬解析数量剧增,进而影响系统的性能。尽管如此,有时仍然会采用这种方法。这里的DDL操作有很多种,通常选择添加注释的COMMENT语句(“COMMENT ON TABLE TB_NAME IS 'xxx by lhr';”),因为使用COMMENT添加注释也是DDL操作,但同时对系统的影响相对而言比较小。

② 在重新收集统计信息时指定NO_INVALIDATE=>FALSE选项。如果取值为FALSE,那么表示将统计信息对象相关的所有Cursor全部失效。目标SQL语句在下次执行时就会使用硬解析。

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

9 + 17 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部