SQL Server、Oracle 如何清除指定SQL的执行计划
一、 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的执行计划相关推荐
- SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享
这个问题是在SQL SERVER 2005 升级到SQL SERVER 2014的测试过程中一同事发现的.我觉得有点意思,遂稍微修改一下脚本展示出来,本来想构造这样的一个案例来演示,但是畏惧麻烦,遂直 ...
- SQL Server,Oracle,DB2索引建立语句的对比
http://database.51cto.com/art/201108/284540.htm SQL Server,Oracle,DB2索引建立语句的对比 2011-08-17 20:48 henr ...
- oracle sql为null值,在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办
在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 ISNULL ( check_expression , replacem ...
- SQL Server中使用自定义指定顺序排序
SQL Server中使用自定义指定顺序排序 原文:SQL Server中使用自定义指定顺序排序 比如需要对SQL表中的字段NAME进行如下的排序: 张三(Z) 李四(L) 王五(W) 赵六(Z) 如 ...
- oracle rds 运维服务_从运维的角度分析使用阿里云数据库RDS的必要性–你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库...
开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库. 云数据库 RDS(Relational Database ...
- VB连接Sql Server,Oracle,SyBase,Access数据库操作实例
- VB连接数据库是常用的操作 对于小型数据的存取是非常不错的.在设计时 对于不同数据的连接方式都不同 这里使用了ADODB连接字符串的方式来访问常见的数据库:Sql Server,Oracle,Sy ...
- SQL Server使用快捷键查看指定表的信息(字段、备注、索引、约束信息等)
在我们工作,学习,开发中,为了快速了解业务,编写业务,需要了解相关的表的信息,下面这个SQL就很有必要了.这个SQL能让我们使用快捷键就能查看指定表的信息(字段.备注.索引.约束信息等),能让我们迅速 ...
- oracle bcp out,SQL Server利用bcp命令把SQL语句结果生成文本文件
这篇文章主要为大家详细介绍了SQL Server利用bcp命令把SQL语句结果生成文本文件,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!在SQL ...
- SQL Server 2019 新特性之 SQL Server大数据群集 介绍(一)
SQL Server 2019 新特性之 SQL Server大数据群集 介绍(一) 从开始SQL Server 2019 预览,SQL Server 大数据群集允许你部署的 Kubernetes 上 ...
最新文章
- 基于的BCH的相关应用是不是该降降温?
- 中国人工智能产业发展指数重磅发布,中国声谷首批AI达摩名单揭晓
- Linux读写锁释放,Linux读写锁的使用
- C++虚继承(二) --- C++ 对象的内存布局(上)(陈皓)
- ubuntu下面pycharm设置pyspark的配置
- 聪明的质监员 2011年NOIP全国联赛提高组(二分+前缀和)
- 三大运营商公布11月运营数据:中国移动固网业务表现亮眼
- 懒人修仙传ce修改方法_盘点《西游记》中增长寿命的6种方法,其中长生不老的方法有三种...
- 大家好 我是新来的
- custompage.width 不能小数吗_为什么有军人戴眼镜?他们的裸眼视力合格吗?
- 数字图像处理与python实现 pdf_python数字图像处理实现直方图与均衡化
- webpack 无法加载文件 C:\Users\User\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本。
- 【转载】C++编码规范与指导
- python中如何进行类的派生与继承_python 面向对象之继承与派生
- 2020牛客暑期多校训练营(第九场)	The Crime-solving Plan of Groundhog
- sphinx分词搜索
- 2020第六届“美亚杯”团队赛WP
- Java 命名规范---阿里Java开发手册
- Android ViewFlipper 使用
- 【MarkDown使用技巧】轻松搞定MarkDown