如何从Microsoft SQL Server中清除所有旧查询计划?


12

我们有一个使用Microsoft SQL数据库的现成应用程序。在此应用程序中,我们为每个报告选择各种选择标准。然后,该应用程序将运行这些报告。

我相信我们有一个查询计划问题。我们每天运行的第一份报告非常快地运行了7分钟。我们在第一个报告后生成的任何报告都需要一个多小时。

每天晚上,我们运行一个计划的任务,该任务将停止并启动SQL Server代理和SQL Server。这个SQL Server实例中大约还有25个其他数据库。没有其他数据库存在性能问题,只有我之前提到的现成产品。

有没有一种方法可以清除SQL Server当前在内存中的所有查询计划?

如何做到这一点而又不影响依赖同一服务器上其他数据库的30多个用户?


Answers:


7

对于先前的回答,我深表歉意。

1)如果您知道每次从存储过程运行查询时,查询都会有所不同,则将WITH RECOMPILE选项添加到CREATE PROCEDURE语句中。WITH RECOMPILE选项可防止重复使用存储过程执行计划,因此SQL Server不会为此过程缓存计划,并且会在运行时重新编译该过程。如果查询每次在存储过程中运行时都会有所不同,则使用WITH RECOMPILE选项可以提高性能,因为在这种情况下,不会使用错误的执行计划。

2)您必须创建一个计划指南,该计划指南针对每种查询类型(每种存储过程请求类型)都使用USE PLAN查询提示来强制执行计划。

这是有关可以提供帮助的执行计划的文章


我同意使用WITH RECOMPILE,我已经使用自己构建的系统完成了此操作。但是,我无权访问sql源...它从应用程序中运行。
迈克尔·赖利

在这种情况下,@ Cape Cod Gunny尝试使用DBCC FLUSHPROCINDB:用于清除SQL Server而不是整个SQL Server上特定数据库的存储过程缓存。您可能需要在测试之前使用此命令,以确保以前的存储过程计划不会对测试结果产生负面影响。示例:DECLARE @intDBID整数SET @intDBID =(从master.dbo.sysdatabases WHERE名称='database_name'选择dbid)DBCC FLUSHPROCINDB(@intDBID)
garik 2011年

该问题已解决。事实证明,用于存储搜索条件的临时表一直在累积数据。该过程应该在收集数据之前截断该表中的数据。感谢漂亮的sql片段。
迈克尔·赖利

13

您在这里问了两个问题。首先,您想知道是否可以删除SQL实例在内存中存储的所有计划。正如Matt M建议的那样,这是通过DBCC FREEPROCCACHE完成的。

您问的第二个问题是“如何在不影响30个左右依赖同一服务器上其他数据库的用户的情况下执行此操作?”。简短的回答是“你不能”。如果删除所有计划,则依赖于内存中计划的其他用户可能会遭受性能损失。

解决方法为此需要一些手动干预。如果您具有plan_handle,则可以使用DBCC FREEPROCCACHE删除特定计划。

从上面的描述来看,这听起来确实像是计划问题,但是我不确定删除计划是否是答案。在考虑删除计划之前,我会向您指出参数嗅探的方向:

http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx

您应该能够优化查询,而不是按计划与DBCC FREEPROCCACHE一起闲逛。我还建议您花时间分析实例的等待事件。


DBCC FREEPROCCACHE无法解决该问题。我会监控活动和事件。有0个物理I / O。它似乎挂在此应用程序上:.Net Sql Client Data Provider。等待类型为CXPACKET。
迈克尔·赖利

CXPACKET表示您的查询正在并行进行。您能否确定正在运行多少个查询线程,并检查它们的等待时间?您可能需要使用Adam Machanic的免费工具WhoIsActive sqlblog.com/files/folders/release/entry29675.aspx
SQLRockstar

7

DBCC免费程序

使用此命令,您可以将整个过程高速缓存清除为单个命令。使用此命令之前,请务必阅读文档。多次阅读“备注”部分。

清除过程高速缓存将导致存储过程高速缓存在下次使用时重新编译。这可能会影响性能。小心使用!

马特


我尝试使用DBCC FREEPROCCACHE,但无法解决问题。1小时后,我结束了这个过程。
迈克尔·赖利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.