我一直在阅读有关执行计划和存储过程中动态参数问题的大量内容。我知道建议的解决方案。
我的问题是,我读过的所有内容都表明SQL Server会缓存存储过程的执行计划。没有提到表值函数。我认为它适用于视图(出于兴趣)。
每次调用表值函数时是否重新编译?
何时最好使用表值函数而不是存储过程?
答案 0 :(得分:29)
内联表值函数(TVF)就像一个宏:它被扩展为外部查询。它没有这样的计划:调用SQL有一个计划。
多语句TVF有一个计划(将找到参考)。
TVF在您想要改变参数化输入的SELECT列表时非常有用。内联TVF将被扩展,优化者将考虑外部select / where。对于多语句TVF,优化是不可能的,因为它必须运行完成,然后过滤。
就个人而言,我会在多语句TVF上使用存储过程。它们更灵活(例如提示,可以更改状态,SET NOCOUNT ON,SET XACTABORT等)。
我不反对内联TVF,但由于无法使用SET和更改状态,因此不会将它们用于面向客户端的代码。
答案 1 :(得分:0)
我还没有验证这一点,但我理所当然地认为函数的执行计划也是缓存的。我看不出为什么那是不可能的原因。
但不会缓存视图的执行计划。视图中的查询将是使用视图的查询的一部分,因此可以为使用视图的查询缓存执行计划,但不能为视图本身缓存。
函数与存储过程的使用取决于您需要的结果。表值函数可以返回单个结果,而存储过程可以返回一个结果,多个结果或根本没有结果。