我们有一个使用动态 sql 创建新序列的过程。然后我们使用动态 sql 从序列中获取下一个值。我们有很多这样的动态序列,但不要把任何一个个体称为很多,但我们会称它们很多。
在计划缓存中,它看起来像这样:
(@new int OUTPUT)SELECT @new = Next Value for dbo.[UniqueSequenceName1]
(@new int OUTPUT)SELECT @new = Next Value for dbo.[UniqueSequenceName2]
--etc
这些正在消耗我们的大量计划缓存,并且往往在它们被推出之前只被调用一次。我打开了针对 Ad Hoc Workload 的优化,但这并没有改变行为。打开强制参数化是否有助于减少计划缓存的负载?还有其他设置可能有帮助吗?
这可以很容易地检查。这是应该模仿您的场景的代码:
现在,如果您检查计划缓存:
您可以清楚地看到两个序列有两个不同的计划:
这是我所期望的。它仅适用于参数,不适用于对象名称。