sql-server - 多用途存储过程:如何知道哪个语句是稳定的?
问题描述
在这篇博文中, Kimberly L. Tripp 描述了创建多用途存储过程的最佳方法。正如她所提到的,最好的方法是option(recompile)
在语句不稳定时使用,这样执行计划就不会被放入缓存中,并且sp_executesql
当我们知道语句是稳定的并且这取决于传递给语句的列的类型时。
我的问题是我们如何知道基于列的语句是否稳定?
1)如果我的语句在我指定一个列时是稳定的,当我沿着其他列指定该列时它是否稳定?
2)如果一个列是高度选择性的(它们的值不同,我们可以从AllDensity colmun值较低的密度向量中知道)是否自动意味着具有该列的语句是稳定的?
解决方案
这实际上不是一个简单的问题要回答。有许多方面会影响计划的稳定性、缓存的内容以及如何避免不必要的重新编译。您所描述的最大问题是基数估计的变化方式,基于统计数据。例如,如果我想检索名称为 A% 的客户,这可能与名称为 D% 的客户完全不同,甚至与 AB% 也大不相同。参数值可能会对确定合适的计划产生重大影响。这会影响所有参数。因此,您正在尝试评估不同的参数值是否会导致计划大相径庭。
为了详细了解它是如何工作的,我在 2012 年写了一份 MSDN 白皮书,虽然那是 8 年前的事,但你所询问的内容并没有发生重大变化。你可以在这里找到它:https ://blog.greglow.com/2013/03/17/whitepaper-plan-caching-and-recompilations-in-sql-server-2012/
我希望今年有机会将其更新到最新版本。
推荐阅读
- python - 如何将 autoit 添加到 Spyder?
- charts - Google 图表时间轴 - 分隔符/分隔符/标签
- shell - 如何将变量值(VM 名称)表单文本文件传递给 jenkins 作业,以便它应该在每个 VM 中执行任务
- flutter - 使用json在flutter本地化中管理复数/性别
- python - 属性错误:列表对象没有属性“应用”
- eclipse - 为什么我的 testng.xml 文件没有以通常的方式显示
- php - 联系表格的 PHP 链接 (DATABASEPHP)
- python - Redash - 更改 Postgres 连接端口
- angular - RxJS 去抖时间运算符的反转?
- azure - 无法从逻辑应用查看 Azure Functions