我一直在大量阅读执行计划以及存储过程中动态参数的问题。我知道建议的解决方案。
不过,我的问题是,我所阅读的所有内容都表明SQL Server缓存了存储过程的执行计划。没有提及表值函数。我认为对Views这样做(出于兴趣)。
每次调用表值函数时,它都会重新编译吗?
什么时候最好使用表值函数而不是存储过程?
最佳答案
内联表值函数(TVF)就像一个宏:它已扩展到外部查询中。它没有这样的计划:调用SQL有一个计划。
多语句TVF有一个计划(将找到引用)。
TVF在您想要更改参数化输入的SELECT列表时很有用。内联TVF被扩展,优化器将考虑外部选择/位置。对于多语句TVF,实际上不可能进行优化,因为它必须先完成然后过滤。
就个人而言,我会在多语句TVF上使用存储的proc。它们更加灵活(例如提示,可以更改状态,SET NOCOUNT ON,SET XACTABORT等)。
我不反对内联TVF,但由于无法使用SET和更改状态,因此不倾向于将它们用于面向客户的代码。
关于sql-server - SQL Server:表值函数与存储过程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4254814/