• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

SQL Server中如何清除特定语句的执行计划缓存

mysql 搞代码 4年前 (2022-01-09) 26次浏览 已收录 0个评论

SQL server运行到一定的时候, 执行计划的缓存可能会相当大,有些能到几个GB的大

SQL server运行到一定的时候, 执行计划的缓存可能会相当大,有些能到几个GB的大小。这个时候假设某个语句比较复杂而且SQL server 生成的执行计划不够优化,你希望把该执行计划的缓存清除使得SQL server能够重新编译该语句。该如何做呢?

如果是存储过程则很好办,直接使用sp_recompile就可以了,如下所示。如果参数是表,那么所有用到该表的存储过程或trigger都会重新编译,从而把原来的plan 替换掉:

USE AdventureWorks;

GO

EXECsp_recompileN’Sales.Customer’;

GO

如果是一般的语句呢? 比如下面的语句:

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’;

我执行上面的语句几次后,观察下执行计划的缓存:

SELECT usecounts,text,plan_handle,*FROMsys.dm_exec_cached_plans cp

CROSSAPPLY sys.dm_exec_query_plan(cp.plan_handle)

CROSSAPPLY sys.dm_exec_sql_text (cp.plan_handle)

wheretextlike

‘%SELECT * FROM Sales.SalesOrderHeader h, Sales.Customer c,Sales.SalesTerritory t

WHERE h.CustomerID = c.CustomerID

AND c.TerritoryID = t.TerritoryID

AND CountryRegionCode%’;

得到结果如下:

Usecounts表示该语句被执行了7次。 如果这个语句的执行计划不好,如何删除它呢?

如果是SQL server 2008 R2就很好办,直接使用DBCC FREEPROCCACHE然后传入plan handle如即可,如:

DBCC FREEPROCCACHE(0x060001002903DC0B4001B887000000000000000000000000)

但是SQL server 2005的FREEPROCCACHE并没有这个用法。 SQL 2005里面如果运行DBCC FREEPROCCACHE那么所有的缓存都会被清空了。这对性能的影响比较大,因为SQL server 要对所有的语句重新编译然后重新生成缓存。SQL server 2005里面有没有其他方法只清除特定的语句的缓存呢?

有的,答案就使用使用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运行后,该语句的执行计划缓存来@源gao*daima.com搞@代#码网就被删除了,下次该语句再次执行就会重新编译。那么我为什么马上又删除这个plan guide呢?因为该语句的缓冲被清除后,我不希望该语句每次执行都重新编译,所以我删除了它,毕竟我执行sp_create_plan_guide的目的是删除该语句的执行计划缓存而已。所以如果你使用同样的手段,务必记得立即把sp_create_plan_guide建立的guide删除。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SQL Server中如何清除特定语句的执行计划缓存

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址