sql-server - SQL Server : Table-valued Functions vs. 存储过程

标签 sql-server function stored-procedures sql-execution-plan

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

不过,我的问题是,我读到的所有内容都表明 SQL Server 缓存了存储过程的执行计划。没有提及表值函数。我认为它对于 View 是这样做的(出于兴趣)。

每次调用表值函数时都会重新编译吗?

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

最佳答案

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

多语句 TVF 有一个计划(将找到引用)。

当您想要更改参数化输入的 SELECT 列表时,TVF 非常有用。内联 TVF 已扩展,优化器将考虑外部 select/where。对于多语句 TVF 优化实际上是不可能的,因为它必须运行到完成,然后进行过滤。

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

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

关于sql-server - SQL Server : Table-valued Functions vs. 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4254814/

相关文章:

matlab - MATLAB中N个函数句柄求和

php - 使用 php 函数返回元素

sql-server - 如果 SQL Server USER_NAME() 是系统名,为什么它返回 NVARCHAR(256)?

mysql - 按日期时间sql合并两个表

c++ - C++中类与函数的模板类型推导?

mysql - 将值从数据库插入到VBA中的本地表

MySQL 存储过程错误代码 : 1064

sql-server - SQL Server过程执行计划的奇怪问题

sql - 如何在SQL Server中将自定义字符串转换为日期

sql-server - SQL Server 2008 安装失败 : Value cannot be null. 参数名称:doc