SQL Server:表值函数与存储过程

Iam*_*mIC 29 sql-server stored-procedures function sql-execution-plan

我一直在阅读有关执行计划和存储过程中动态参数问题的大量内容.我知道建议的解决方案.

不过,我的问题是,我读过的所有内容都表明SQL Server会缓存存储过程的执行计划.没有提到表值函数.我认为它适用于视图(出于兴趣).

每次调用表值函数时是否重新编译?

什么时候最好使用表值函数而不是存储过程?

gbn*_*gbn 30

内联表值函数(TVF)就像一个宏:它扩展到外部查询.它没有这样的计划:调用SQL有一个计划.

多语句TVF有一个计划(将找到参考).

如果要改变参数化输入的SELECT列表,TVF非常有用.内联TVF将被扩展,优化者将考虑外部select/where.对于多语句TVF,优化实际上是不可能的,因为它必须运行完成,然后过滤.

就个人而言,我会在多语句TVF上使用存储过程.它们更灵活(例如提示,可以改变状态,SET NOCOUNT ON,SET XACTABORT等).

我不反对内联TVF,但由于无法使用SET和更改状态,因此不倾向于将它们用于面向客户端的代码.

  • 黑盒子的意思是:你的tvf返回20列.你从tvf WHERE foo = bar`中选择`col1 col2,col2.内联TVF(或只有col1和col2的存储过程)将计算col1,col2与where的计划.多TVF必须运行所有20列,假脱机结果,然后过滤,然后限制为2列. (4认同)