我需要在一些SQL Server数据集上重复执行一些简单的函数,如重载,二进制步骤,sigmoids和各种切线。我经常听说通过T-SQL导出这些函数中使用的任何集合和聚合是有效的,但是在T-SQL中重复执行那种函数的效率很低。根据我的阅读,根据SQL Server专家杰夫莫登的流行术语,使用T-SQL为此目的显然有资格作为“RBAR”操作,或者“按行分类行”。在分散在互联网上的各种文章中,我经常读到这些函数应该用C#或VB.Net来实现,但我不清楚我究竟该如何解决这个问题并仍然避免使用RBAR。有人能指出我为此目的使用.Net语言的一些最佳做法吗?这提出了一些密切相关的问题,如:
1)我能否在CLR功能中有效地做到这一点?
2)在这些函数中使用C#或VB.Net数组并整体提供整套数据会更有效吗?
3)如果我仍然为集合中的每个记录调用一次CLR函数,我怎么能避免在这样的设计中使用RBAR,就像我使用普通的SQL Server函数一样?
4)是否应该在中间层对象中捕获此类逻辑并通过网络提供数据?
5)如果我必须整天不定期地执行这些功能,我是否可以在服务器端运行C#或VB.net程序并持续提供数据?此解决方案可能与#2一起使用,但我认为如果允许在SQL Server控制之外消耗太多内存/ CPU / IO,则可能会损害服务器稳定性。
这些问题的主旨主要针对一个目标:在执行这些功能时找到避免RBAR的最有效方法。如果我没有提及其他一些避免它们的方法,请告诉我。我已经知道如何通过使用T-SQL来创建聚合和基于集合的解决方案来避免一些RBAR,但我想知道我是否可以消除与重复函数调用直接相关的任何其他问题。最佳实践似乎是使用.Net而不是SQL Server函数来实现这一点,但我对如何在实践中实现它很模糊。在为我澄清这个设计决定时,我们将不胜感激。
答案 0 :(得分:0)
没有。 CLR只是一个用.Net编写的函数,在SQL Server中公开,因此SQL引擎可以调用它。它们通常比优化的SQL查询效率低,但允许您执行SQL无法执行的操作,如高级字符串操作或分析计算。作为一种副作用,CLR允许Web程序员创建在SQL对他们来说很陌生时有意义的代码,但这也避免了SQL基于集合(非RBAR)的高效操作。
如果计算超出整个数据集,例如在松鼠数据库中查找平均松鼠重量,则可以使用基于集合的聚合来获取CLR函数的输入(SELECT AVG([Weight])FROM dbo。 SQUIRRELS),但是如果您需要对数据中的每一行进行计算,那么如果SQL无法进行计算,您就会陷入困境。
如果可以使用SQL执行计算,则应创建一个执行计算的内联表值函数,然后使用OUTER APPLY更新计算字段。如果你想看看这条路线,这是一个解释。 Rob Farley's SQL Blog