2011-11-01 171 views
0

我们有一个每小时更新一次的数据库。对于更新或插入的每一行使用DELETE/INSERT的应用程序进行更改。 SQL Server是2008 R2标准版。用于填充计划缓存的即席查询的SQL Server执行计划

即席查询的查询执行计划正在推出其他(更重要,更大的)执行计划,这些计划正在影响对该数据库的报告并进入数据缓存。

查看计划缓存后,我们发现(如预期的那样)SQL正在为每个查询生成一个新计划。

我的问题是,会创建一个计划指南停止SQL为每个更新生成一个新的计划?

我在缓存中看到,例如,对于float列的更新,SQL将其参数化为每次变化长度的数字,这意味着每个参数化查询都是不同的。如果我使用查询的参数化版本创建计划指南,为每个列指定正确的数据类型,这是否会强制SQL使用此计划?

我知道使用存储过程将解决这个问题,但是由于其他原因,这不是一个选项。

谢谢。

回答

0

您是否尝试启用'针对特定工作负载进行优化'

特设工作负载选项的优化来提高包含许多单个 利用特设批工作负载 效率计划缓存的。当此选项设置为1时,数据库引擎 在第一次编译批次为 而不是完整编译计划时,会在计划高速缓存中存储一​​个小的编译计划存根。这个 有助于缓解内存压力,因为不允许计划缓存到充满编译计划,不被重用。

将ad hoc工作负载的优化设置为1只影响新计划; 已经在计划缓存中的计划不受影响。

Ref

Plan cache and optimizing for adhoc workloads

要启用此功能,使用这些命令(我会在测试系统上进行测试在前):

SP_CONFIGURE 'show advanced options',1 
RECONFIGURE 
GO 

SP_CONFIGURE 'optimize for ad hoc workloads',1 
RECONFIGURE 
GO 
+0

谢谢,但我忘了说,我已启用此。不幸的是我们还没有看到任何真正的改善 – Chris

+0

你能清除proc缓存吗? (是的,提到你打开这个事实是一个遗漏......) –

+0

3444答案,2个问题。 – dikidera