4

您为什么不选择为 SQL Server 中的即席查询启用强制参数化而不是简单参数化?

有性能开销吗?如果是这样,它不会被重用查询计划所获得的(可能的)收益所抵消吗?

4

1 回答 1

6

您是否分析过您的计划缓存以查看您是否有大量的一次性计划?

SELECT usecounts, COUNT(*), SUM(size_in_bytes) 
  FROM sys.dm_exec_cached_plans
  GROUP BY usecounts
  ORDER BY usecounts;

您是否考虑过“针对临时工作负载进行优化”设置,它至少只存储计划的存根,直到它被多次使用?我发现这非常有效。

如果您有很多即席 SQL,并且您看到计划缓存膨胀,那么尝试强制参数化不会有什么坏处。但是您应该彻底测试您的整个工作负载,因为在某些情况下开销可能超过收益(特别是如果您大量使用索引视图、持久计算列或分区,您最终可能会得到更糟糕的计划)。重要的是要注意,当您打开此设置时,它也会DBCC FREEPROCCACHE为您运行,所以预计会出现一些小问题,您所有的现有计划都需要在下次需要时重新编译。(当然,在您已经拥有“针对临时优化”以及许多一次性计划的情况下,这影响要小得多,因为您主要是在驱逐可能在重新使用之前被刷新的存根。

另请注意,在许多情况下,此设置对单个查询没有影响(请参阅联机丛书主题)。

于 2012-04-24T12:33:05.337 回答