强制参数化

时间:2012-04-24 12:19:22

标签: sql-server sql-execution-plan parameterization

对于SQL Server中的即席查询,您不会选择为简单参数化启用强制参数化的原因是什么?

是否存在性能开销?如果是这样,它不会被重复使用的查询计划所产生的(可能的)收益所抵消?

1 个答案:

答案 0 :(得分:6)

您是否分析过您的计划缓存,看看您是否拥有大量的一次性使用计划?

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

您是否考虑过“optimize for ad hoc workloads”设置,该设置至少只存储该计划的存根,直到它被多次使用为止?我发现这很有效。

如果您有大量的临时SQL,并且您看到计划缓存膨胀,那么尝试强制参数化也不会有什么坏处。但是你应该彻底测试你的整个工作负载,因为有些情况下开销可以超过收益(特别是如果你大量使用索引视图,持久化计算列或分区,你最终可能会更糟糕的计划)。重要的是要注意,当您打开此设置时,它也为您运行DBCC FREEPROCCACHE,因此预计会有一些打嗝,您需要在下次需要时重新编译所有现有计划。 (当然,在你已经'优化了ad hoc'并结合大量的一次性使用计划的情况下,这种影响远远不那么明显,因为你主要是驱逐可能在重新使用之前刷新的存根。)

另请注意,在许多情况下,此设置对单个查询没有影响(请参阅Books Online topic)。

相关问题