我应该在SQL服务器或C#中使用“用户定义的函数”吗?

时间:2010-04-28 22:47:38

标签: c# .net sql-server

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

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

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

我该怎么办?

4 个答案:

答案 0 :(得分:2)

复杂的数学函数在C#中的执行速度要比T-SQL快得多。这非常值得尝试。

修改在回答您的评论时,我找到了this blog post,其中指出:

  

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

结束一次测试:

  

在这个素数验证函数的情况下,SQLCLR相对于T-SQL的性能优势是加速的一个数量级!

所以,C#听起来像是要走的路。

答案 1 :(得分:1)

我会做两件事,衡量时间并坚持使用性能更好的人。

答案 2 :(得分:1)

SQL Server中的

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

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

内联表值用户定义函数 ,otoh,因为它简单地定义为sql语句本身,可以折叠成整体查询计划,因此是极其快速和高效。

对于复杂的数学函数,通常这可能是不可能的,或者至少是非常困难的),但是如果你的函数可以写成内联UDF,那肯定是要走的路。否则,你最好在代码中做这件事。

答案 3 :(得分:0)

正如@otavio所说,你需要在决定之前获得测量结果。但是也应该考虑更大的集合或优化中的自我功能。例如,您是在同一数据上多次运行此功能,还是可以根据需要执行此操作。例如,你可以存储结果吗?你是否能够编写一个更大的函数来操作一组数据而不是调用它等等。