【问题标题】:Forced Parameterization强制参数化
【发布时间】:2012-04-24 12:19:21
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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,因此预计会出现一些小问题,您的所有现有计划在下次需要时都需要重新编译。 (当然,在您已经拥有“针对临时优化”以及许多一次性计划的情况下,这影响要小得多,因为您主要是在驱逐可能在重新使用之前被刷新的存根。)

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

    【讨论】:

    • 可以说我没有具体的数据库问题,了解了设置后我更感兴趣了。消息来源没有解释打开强制参数化的负面影响,所以我很好奇为什么你不会默认打开它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2014-04-15
    相关资源
    最近更新 更多