Table-Valued Function (SQL) 是否在每次调用时创建 table? [表现]

Does Table-Valued Function (SQL) create table on each call? [performance]

好吧,这个听起来可能是个菜鸟问题,但SQL不是我的强项,所以我在这里请求一些帮助。

我正在尝试实现一些东西,但我担心性能问题。

我要解决的问题是这样的:

我有一列包含很多 数据,用逗号分隔 "," 像这样:data1,data2,data3,data57

我需要的是遍历每条数据所有记录用逗号分隔,然后然后对单条数据做一些事情[=41= 】 数据,你懂了吗?

我找到了 can actually help me 的解决方案,但我 担心系统性能,因为我可能需要使用不同的参数多次调用 此函数!

是在我对 Table-Valued Function (UDF) 进行的每次调用时创建 table 还是 sql 服务器将其保存为缓存? [也许我宁愿需要一个临时的 table?]

提前感谢您的帮助!


注意:数据不是我的,我应该按原样使用,所以建议更改数据库是不可能的(但我知道那是最好的设想)。 一个 注意2:这个question/problem的目的是将初始数据导入数据库,性能可能不是一个严重的问题,因为它不会运行很多次,但我还是想考虑这个问题,并尽我所能!

用户定义的 table 值函数由多个语句组成,正如您找到的那样,将在 tempdb 系统数据库中创建一个对象,填充它然后处理当对象超出范围时。

如果您想 运行 多次使用相同的参数,您可以考虑创建一个 table 变量并将结果缓存在其中。但是,如果您打算在逗号分隔值的不同列表上调用它,则没有避免开销的好方法。 SQL 服务器并不是真正为大量字符串操作而构建的。

通常,对于一次性作业,使用此 tempdb 的性能影响不会成为您的主要关注点。当它成为日常数据库生活中的常见模式时,它更令人担忧。

如果可以的话,我建议尝试使用大小合适的数据子集来衡量解决方案的性能。

既然你说你在 SQL Server 2016 上,你可以使用新的 STRING_SPLIT 功能,比如

SELECT t.Column1, t.Column2, s.value
FROM table t
CROSS APPLY STRING_SPLIT(t.CsvColumn, ',') s

可能会让您接近您想要的位置,而无需定义新函数。请注意,您的数据库需要 运行ning 在 2016 兼容级别 (130) 下才能使用,仅 运行ning 在 SQL 2016 是不够的(他们经常这样做具有新功能以避免破坏向后兼容性的更改的风险)。