You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server内联表值函数参数类型非实质差异时能否重用执行计划?

SQL Server内联表值函数与存储过程的执行计划重用差异

核心结论

内联表值函数绝对不会在参数类型存在无意义差异时重用执行计划,这种自动转换参数并重用计划的行为仅适用于存储过程。

具体分析

内联表值函数的行为

内联表值函数(TVF)在执行时会被展开到调用它的查询语句中,相当于查询的一部分。SQL Server对这类查询的计划缓存,是基于完整的查询文本+参数的精确类型签名来判断的:

  • 你给出的第一个查询里,@Long是nvarchar(500)类型,传入foo的varchar(MAX)参数时,SQL Server会自动添加隐式转换逻辑,等价于执行SELECT * FROM (foo的内部逻辑 WHERE 匹配列 = CONVERT(varchar(MAX), @Long));
  • 第二个查询里的@Short是varchar(5)类型,虽然也会隐式转换为varchar(MAX),但参数的原始类型和第一个查询不同,SQL Server会判定这是两个不同的查询请求,因此会生成全新的执行计划,不会重用第一次的缓存计划。

存储过程的差异

存储过程的参数匹配逻辑是基于存储过程定义的参数类型:
当调用存储过程时,如果传入的参数类型可以隐式转换为存储过程定义的参数类型,SQL Server会先完成类型转换,再基于存储过程的参数类型生成执行计划。所以不管你传入的是varchar(5)还是nvarchar(500),只要能转成存储过程定义的varchar(MAX),两次调用都会重用同一个执行计划(除非遇到参数嗅探等特殊场景)。

验证方式

你可以通过查询系统视图sys.dm_exec_cached_plans和sys.dm_exec_sql_text来验证:调用内联TVF的两次查询会对应不同的缓存计划,而调用存储过程的两次请求会共享同一个计划。

内容的提问来源于stack exchange,提问作者J. Mini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:17:08