一、 SQL Server

1. 存储过程

如果是存储过程,可以使用sp_recompile指定存储过程名重新编译。

注意如果里面的参数是表名,那么所有用到该表的存储过程和trigger都会重新编译,谨慎操作。

-- 参数是存储过程名
USE AdventureWorks;
GO
EXEC sp_recompile N'myproc';
GO
-- 参数是表名
USE AdventureWorks;
GO
EXEC sp_recompile N'mytable';
GO

2. 一般sql

如果是一般的语句,比如

use AdventureWorks
go
SELECT * FROM Sales.SalesOrderHeader h, Sales.Customer c,Sales.SalesTerritory t
WHERE h.CustomerID = c.CustomerID
AND c.TerritoryID = t.TerritoryID
AND CountryRegionCode = N'CA';

可以先找到其plan_handle

SELECT usecounts,text,plan_handle,* FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle)
CROSS APPLY sys.dm_exec_sql_text (cp.plan_handle)
where textlike
'%SELECT * FROM Sales.SalesOrderHeader h, Sales.Customer c,Sales.SalesTerritory t
WHERE h.CustomerID = c.CustomerID
AND c.TerritoryID = t.TerritoryID
AND CountryRegionCode%';

然后根据版本不同,清除操作也有所不同

① SQL Server 2008 R2及以上

直接使用DBCC FREEPROCCACHE然后传入plan_handle即可

DBCC FREEPROCCACHE(0x060001002903DC0B4001B887000000000000000000000000)

② SQL Server 2008 R2以下

SQL Server 2005的FREEPROCCACHE并不支持带参数,只能运行DBCC FREEPROCCACHE清空所有缓存,这对性能的影响比较大。有没有其他方法只清除特定的语句的缓存呢?

有的,答案就是使用plan guide

sp_create_plan_guide
@name =  N'recompile_Guide',
@stmt =
N'SELECT * FROM Sales.SalesOrderHeader h, Sales.Customer c,Sales.SalesTerritory t
WHERE h.CustomerID = c.CustomerID
AND c.TerritoryID = t.TerritoryID
AND CountryRegionCode = N''CA'';',
@type = N'SQL',
@module_or_batch =NULL,
@params =NULL,
@hints = N'OPTION (RECOMPILE)'
go
exec sp_control_plan_guide N'drop',N'recompile_Guide'

上面的sp_create_plan_guide使用RECOMPILE参数,意思是说,每次碰到该语句,必须重新编译。sp_create_plan_guide运行后,该语句的执行计划缓存就被删除了,下次该语句再次执行就会重新编译。那么我为什么马上又删除这个plan guide呢?因为该语句的缓存被清除后,我不希望该语句每次执行都重新编译,毕竟我执行sp_create_plan_guide的目的是删除该语句的执行计划缓存而已。所以如果你使用同样的手段,务必记得立即把sp_create_plan_guide建立的guide删除。

3. 清除指定数据库所有执行计划

2016之前有一个非公开的方法

DBCC FLUSHPROCINDB(db_id) 

2016开始,正式提供了sql,支持清除指定数据库所有执行计划

ALTER DATABASE dnname CONFIGURATION CLEAR PROCEDURE_CACHE Criteria for plan reuse;

二、 Oracle

Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷出特定对象,例如游标,包,序列,触发器等。也就是说可以删除、清理特定SQL的执行计划。避免你为了刷新一个sql执行计划将整个SHARED POOL清空的危险情况。可以在$ORACLE_HOME/rdbms/admin/dbmspool.sql中查看该包的具体定义

PURGE存储过程有三个参数:

DBMS_SHARED_POOL.PURGE (name    VARCHAR2, flag    CHAR DEFAULT 'P', heaps   NUMBER DEFAULT 1);Argument Name                  Type                    In/Out Default?------------------------------ ----------------------- ------ --------NAME                           VARCHAR2                INFLAG                           CHAR                    IN     DEFAULTHEAPS                          NUMBER                  IN     DEFAULT
  • NAME:为逗号分隔的ADDRESS列和HASH_VALUE列的值。
  • FLAGS:可以有多个选项,清除sql执行计划填C,具体意义如下所示:

  • HEAPS:一般使用默认值1,清理整个对象

Heaps to be purged. For example, if heap 0 and heap 6 are to be purged:

1<<0 | 1<<6 => hex 0x41 => decimal 65, so specify heaps =>65.Default is 1, that is, heap 0 which means the whole object would be purged

清理指定sql语句执行计划方法如下:

col SQL_TEXT format a35
col ADDRESS format a18
col HASH_VALUE format a10
select s.SQL_TEXT, s.ADDRESS, s.HASH_VALUE||'' from v$sqlarea s where sql_id='xxxx';SQL_TEXT                             ADDRESS           S.HASH_VALUE||''
----------------------------------- ------------------ --------------------------------
select /*gg*/count(*) from test     0000000300B06D70   728448230--清除该sql执行计划
exec sys.dbms_shared_pool.purge('0000000300B06D70,728448230','c');-- 再次查询,一般无输出结果,除非sql执行频率特别高
select s.SQL_TEXT, s.ADDRESS, s.HASH_VALUE||'' from v$sqlarea s where sql_id='xxxx';

参考

如何清除特定语句的执行计划缓存_51CTO博客_oracle清除执行计划缓存

ORACLE从共享池删除指定SQL的执行计划 - 潇湘隐者 - 博客园

Oracle 11g如何清除share pool中某条SQL的执行计划_深圳gg的博客-CSDN博客_oracle flush share pool

SQL Server、Oracle 如何清除指定SQL的执行计划相关推荐

  1. SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享

    这个问题是在SQL SERVER 2005 升级到SQL SERVER 2014的测试过程中一同事发现的.我觉得有点意思,遂稍微修改一下脚本展示出来,本来想构造这样的一个案例来演示,但是畏惧麻烦,遂直 ...

  2. SQL Server,Oracle,DB2索引建立语句的对比

    http://database.51cto.com/art/201108/284540.htm SQL Server,Oracle,DB2索引建立语句的对比 2011-08-17 20:48 henr ...

  3. oracle sql为null值,在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办

    在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 ISNULL ( check_expression , replacem ...

  4. SQL Server中使用自定义指定顺序排序

    SQL Server中使用自定义指定顺序排序 原文:SQL Server中使用自定义指定顺序排序 比如需要对SQL表中的字段NAME进行如下的排序: 张三(Z) 李四(L) 王五(W) 赵六(Z) 如 ...

  5. oracle rds 运维服务_从运维的角度分析使用阿里云数据库RDS的必要性–你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库...

    开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库. 云数据库 RDS(Relational Database ...

  6. VB连接Sql Server,Oracle,SyBase,Access数据库操作实例

    - VB连接数据库是常用的操作 对于小型数据的存取是非常不错的.在设计时 对于不同数据的连接方式都不同 这里使用了ADODB连接字符串的方式来访问常见的数据库:Sql Server,Oracle,Sy ...

  7. SQL Server使用快捷键查看指定表的信息(字段、备注、索引、约束信息等)

    在我们工作,学习,开发中,为了快速了解业务,编写业务,需要了解相关的表的信息,下面这个SQL就很有必要了.这个SQL能让我们使用快捷键就能查看指定表的信息(字段.备注.索引.约束信息等),能让我们迅速 ...

  8. oracle bcp out,SQL Server利用bcp命令把SQL语句结果生成文本文件

    这篇文章主要为大家详细介绍了SQL Server利用bcp命令把SQL语句结果生成文本文件,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!在SQL ...

  9. SQL Server 2019 新特性之 SQL Server大数据群集 介绍(一)

    SQL Server 2019 新特性之 SQL Server大数据群集 介绍(一) 从开始SQL Server 2019 预览,SQL Server 大数据群集允许你部署的 Kubernetes 上 ...

最新文章

  1. 基于的BCH的相关应用是不是该降降温?
  2. 中国人工智能产业发展指数重磅发布,中国声谷首批AI达摩名单揭晓
  3. Linux读写锁释放,Linux读写锁的使用
  4. C++虚继承(二) --- C++ 对象的内存布局(上)(陈皓)
  5. ubuntu下面pycharm设置pyspark的配置
  6. 聪明的质监员 2011年NOIP全国联赛提高组(二分+前缀和)
  7. 三大运营商公布11月运营数据:中国移动固网业务表现亮眼
  8. 懒人修仙传ce修改方法_盘点《西游记》中增长寿命的6种方法,其中长生不老的方法有三种...
  9. 大家好 我是新来的
  10. custompage.width 不能小数吗_为什么有军人戴眼镜?他们的裸眼视力合格吗?
  11. 数字图像处理与python实现 pdf_python数字图像处理实现直方图与均衡化
  12. webpack 无法加载文件 C:\Users\User\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本。
  13. 【转载】C++编码规范与指导
  14. python中如何进行类的派生与继承_python 面向对象之继承与派生
  15. 2020牛客暑期多校训练营(第九场) The Crime-solving Plan of Groundhog
  16. sphinx分词搜索
  17. 2020第六届“美亚杯”团队赛WP
  18. Java 命名规范---阿里Java开发手册
  19. Android ViewFlipper 使用
  20. 【MarkDown使用技巧】轻松搞定MarkDown

热门文章

  1. 计算机专业夏令营英语面试范文,夏令营面试英语自我介绍
  2. android 收藏功能,5款不可思议的安卓黑科技APP,各个超级实用,希望大家低调收藏...
  3. 大学四年因为知道了这30个超强Java自学网站,毕业直接让我月薪过万!
  4. 解决QQ客服链接点开后不能进入添加好友或者聊天界面
  5. 带你一起学习C语言语法
  6. 初入HTML和CSS
  7. c语言日期计算器程序代码,旧计算器(C语言代码)
  8. Perl语言面向对象入门
  9. 编写测试用例基本要求、非功能性测试和状态迁移法介绍
  10. 有xp系统的云服务器,哪个云服务器有xp系统