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

我相信我们有一个查询计划问题。我们每天运行的第一份报告运行速度非常快,只需 7 分钟。我们在第一份报告之后运行的任何报告都会花费一个多小时。

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

有没有办法清除SQL Server当前在内存中的所有查询计划?

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

有帮助吗?

解决方案

我对我以前的答案表示歉意。

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

2)你必须 创建使用使用计划查询的计划指南 提示每种类型的查询(每种存储过程请求类型)强制执行计划。

这是 文章 关于可以帮助的执行计划。

其他提示

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

您问的第二个问题是:“我该如何执行此操作,而不会影响30个左右依赖同一服务器上其他数据库的用户?”。简短的答案是“你不能”。如果您删除所有计划,那么依靠计划中的计划的用户可能会遭受性能的打击。

解决方法需要一些手动干预。您可以使用DBCC freeproccache删除特定的计划,只要您拥有plan_handle。

从您上面描述的内容中,它听起来像是一个计划问题,但是我不确定删除计划是答案。在考虑删除计划之前,我会指向参数嗅探的方向:

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

您应该能够优化查询,而不是按计划使用DBCC freeprocache欺骗。我还建议您花时间分析您的实例的等待事件。

DBCC FREEPROCCache

使用此命令,您可以将整个过程缓存清除为单个命令。在使用此命令之前一定要阅读文档。阅读备注部分几次。

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

马特

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top