繁体   English   中英

我应该在SQL Server还是C#中使用“用户定义函数”?

[英]Should I use “User Defined Functions” in SQL server, or C#?

我有一个相当复杂的数学函数,建议我在SQL Server中将其实现为用户定义函数,以便可以在SQL查询中有效地使用它。

问题在于它必须非常高效,因为它每秒可能执行数千次,并且随后我听说UDF效率很低。

有人建议我可以改用C#实现该功能,这样会更加高效。

我该怎么办?

在C#中,复杂的数学函数比T-SQL更快地执行。 值得尝试。

编辑为了回答您的评论,我发现了此博客文章 ,其中指出:

用户定义的标量函数可能是使用SQLCLR的最明显候选者。 这有两个主要原因。 首先是CLR函数实际上比T-SQL函数具有更低的调用开销。 T-SQL函数需要运行时才能创建新的T-SQL框架,这很昂贵。 CLR函数作为直接执行的函数指针嵌入到计划中。

并得出一个单一测试的结论:

在这种质数验证功能的情况下,与T-SQL相比,SQLCLR的性能优势是加速的一个数量级!

因此,C#听起来很可行。

我会两者都做,测量时间并坚持使用性能更好的方法。

SQL Server中的标准 UDF效率低下,因为它们每次运行时都会被编译(因为它们不包含在查询处理器执行的整个SQL语句的查询计划中)。

这是因为标准UDF定义了一种处理算法,该算法无法“折叠”到外部sql语句正在执行的整体查询计划中。

内联表值用户定义函数 otoh因为简单地定义为sql语句本身,因此可以折叠到整个查询计划中,因此非常快速且高效。

对于复杂的数学函数,通常这可能是不可能的,或者至少很难做到),但是如果您的函数可以作为内联UDF编写,那肯定是可行的方法。 否则,最好在代码中进行。

正如@otavio所说,您需要在决定之前获取测量值。 但是,还应考虑在更大的范围内或对其进行优化的自身功能。 例如,您是在同一数据上多次运行此功能,还是可以根据需要执行此功能。 例如,您可以存储结果吗?是否可以编写一个更大的函数来处理一组数据,而不是调用它等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM