首页 > 解决方案 > 多用途存储过程:如何知道哪个语句是稳定的?

问题描述

在这篇文中, Kimberly L. Tripp 描述了创建多用途存储过程的最佳方法。正如她所提到的,最好的方法是option(recompile)在语句不稳定时使用,这样执行计划就不会被放入缓存中,并且sp_executesql当我们知道语句是稳定的并且这取决于传递给语句的列的类型时。

我的问题是我们如何知道基于列的语句是否稳定?

1)如果我的语句在我指定一个列时是稳定的,当我沿着其他列指定该列时它是否稳定?

2)如果一个列是高度选择性的(它们的值不同,我们可以从AllDensity colmun值较低的密度向量中知道)是否自动意味着具有该列的语句是稳定的?

标签: sql-serverstored-procedures

解决方案


这实际上不是一个简单的问题要回答。有许多方面会影响计划的稳定性、缓存的内容以及如何避免不必要的重新编译。您所描述的最大问题是基数估计的变化方式,基于统计数据。例如,如果我想检索名称为 A% 的客户,这可能与名称为 D% 的客户完全不同,甚至与 AB% 也大不相同。参数值可能会对确定合适的计划产生重大影响。这会影响所有参数。因此,您正在尝试评估不同的参数值是否会导致计划大相径庭。

为了详细了解它是如何工作的,我在 2012 年写了一份 MSDN 白皮书,虽然那是 8 年前的事,但你所询问的内容并没有发生重大变化。你可以在这里找到它:https ://blog.greglow.com/2013/03/17/whitepaper-plan-caching-and-recompilations-in-sql-server-2012/

我希望今年有机会将其更新到最新版本。


推荐阅读