1

好吧,这个听起来可能是一个noob问题,但是SQL并不是我真正的强项,所以我在这里请求一些帮助。Table-Valued函数(SQL)是否在每次调用时创建表? [性能]

我想实现一些东西,但是我担心性能问题。

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

我有很多逗号分离数据列“” 事情是这样的:数据1,数据2,数据3,data57

我需要的是循环浏览每条数据用逗号分隔所有的记录,然后然后用这个单一的东西做点什么数据,你明白了吗?

我发现一个解决方案,can actually help me,但我担心系统性能,因为我可能需要使用不同的参数多次调用这个函数!

在我对Table-Valued函数(UDF)进行的每次调用中创建表还是sql server将它保存为缓存? [也许我宁愿需要一个临时桌子?]

谢谢你的帮助提前!


注:的数据是不是我的,我应该使用它原样,所以建议更改数据库是毫无疑问的(但我知道这将是最好的情况)。 a 注2:这个问题的目的是将初始数据导入到数据库中,由于性能可能不会运行很多次,所以性能可能并不是一个严重的问题,但我仍然要考虑这个问题,我能做的最好的方式!

+1

是的。该函数将在'tempdb'中创建一个条目并填充它,然后在每次调用中处理它。 – TZHX

+0

Alllrighhht ...感谢您的评论!请写一个适当的答案,我会很乐意接受它:) – TiagoM

+0

顺便说一句,如果你可以提供更好的解决方案来解决这个问题,请成为我的客人,我将不胜感激:) – TiagoM

回答

2

用户定义的由多个语句组成的表值函数(如您找到的那样)将在系统数据库中创建一个对象,并填充该对象,然后在对象超出作用域时对其进行处置。

如果你想在相同的参数上多次运行这个,你可以考虑创建一个表变量并缓存你自己的结果。如果你打算用逗号分隔的值在不同的列表上调用它,那么避免这种开销并不是一个好方法。 SQL Server并不是真正为大量的字符串操作而构建的。

通常,对于一次性作业,此tempdb用法的性能影响不会成为您的主要担忧。它更关心的是它在数据库生活中的常见模式。

如果可以的话,我会建议您在适当大小的数据子集上测试解决方案的性能。

既然你说你的SQL Server 2016上,您可以利用新的STRING_SPLIT功能,像

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

可能让你靠近你想去的地方,而不需要定义一个新的功能。请注意,您的数据库需要在2016年兼容级别(130)下运行才能使用,只需在SQL 2016上运行是不够的(它们通常会使用新功能执行此操作,以避免发生向后兼容性风险 - 中断更改)。

+0

感谢您的回答,我试图运行该查询来检查结果,但它到目前为止工作不正常,它说“无效的对象名'STRING_SPLIT'”。此外,我不得不改变擦除s.value,因为's'不代表任何表,也许这是一个错字,你的意思是?谢谢 ! – TiagoM

+1

好的,所以我打算把s作为别名添加到STRING_SPLIT返回的表中;但它听起来像你没有那个。你可以检查数据库的兼容性级别吗?它可能会设置为2014(120)或2012(110),除非您可以更改它,否则将使STRING_SPLIT不可用。 – TZHX

+0

我刚刚从谷歌注意到,我需要运行这个命令:“ALTER DATABASE TestAzureDB SET COMPATIBILITY_LEVEL = 130” – TiagoM

相关问题