【问题标题】:SQL Server 2008 CLR vs T-SQL: Is there an efficiency/speed difference?SQL Server 2008 CLR 与 T-SQL:效率/速度有区别吗?
【发布时间】:2011-01-07 01:33:14
【问题描述】:

我是一名 C# 开发人员,在 T-SQL 中完成了一些基本的数据库工作。但是,我需要编写一个非常复杂的存储过程,远远超出我的 T-SQL 知识。

使用 .net CLR 作为 SQL Server 2008 的一部分在 C# 中编写存储过程是否会导致存储过程的效率低于使用 T-SQL 编写的存储过程?差异(如果有的话)是否显着?为什么?

【问题讨论】:

    标签: sql-server sql-server-2008 tsql clr sqlclr


    【解决方案1】:

    请看Performance of CLR Integration:

    本主题讨论了一些 增强的设计选择 Microsoft SQL Server 的性能 与 Microsoft .NET 集成 框架公共语言运行时 (CLR)。

    【讨论】:

      【解决方案2】:

      CLR 需要一些通信开销(在CLR 和SQL Server 之间传递数据)

      经验法则是:

      • 如果您的逻辑主要包括海量数据集的转换,可以使用集合操作执行,则使用TSQL。

      • 如果您的逻辑主要包括相对少量数据的复杂计算,请使用CLR。

      使用集合操作可以做的比看起来要多得多。如果您在此处发布您的要求,我们可能会提供帮助。

      【讨论】:

      • 我们所说的通信开销有多大?我确实有大量数据集,但我也在对其进行复杂的计算而不是集合操作。
      • @bytenik:这在很大程度上取决于您将如何处理数据。例如,内置的 SQL 聚合函数的工作速度大约是 3 的两倍 CLR 聚合。例如,如果您要连接两个记录集,则需要开发并硬编码连接到 CLR,而 SQL Server 有几种本机算法并选择最合适的一种,这可能会提高性能震级。另一方面,SQL Server 缺少运行聚合,CLR 可以提供很大帮助。我需要查看您的要求才能给出更具体的答案。
      【解决方案3】:

      “使用 .net CLR 作为 SQL Server 2008 的一部分在 C# 中编写存储过程是否会导致我的存储过程的效率低于使用 T-SQL 编写的存储过程?”的问题?实在是太宽泛了,无法给出有意义的答案。效率差异很大,不仅取决于您正在执行的操作类型,还取决于您进行这些操作的方式。您可能有一个 CLR 存储过程,它的性能应该优于等效的 T-SQL Proc,但实际上由于编码不佳而性能更差,反之亦然。

      鉴于问题的一般性质,我可以说“一般而言”,可以在 T-SQL 中完成的事情(没有太多复杂性)可能应该在 T-SQL 中完成。 TVF 可能是一个例外,因为 CLR API 有一个非常有趣的选项可以将结果流回(我为 SQL Server Central 写了一篇文章——需要免费注册——关于 STVFs)。但是,如果没有 CLR 和 T-SQL 版本的代码并使用生产级数据进行测试,就无法确定(即使写得不好的代码通常在 10k 行或更少的情况下也能很好地执行)。

      所以这里的真正问题归结为:

      我对 C# 的了解胜过对 T-SQL 的了解。我该怎么办?

      在这种情况下,最好简单地询问如何在 T-SQL 中处理这个特定任务。很可能有一些不复杂的解决方案,您只是碰巧还不知道,但在了解功能/技术/等后能够理解。您仍然可以在 SQLCLR 中编写等效的解决方案并比较它们之间的性能。但是如果在 T-SQL 中处理没有满意的答案,那就在 SQLCLR 中处理。

      话虽如此,我在 3 年前做过一项关于 SQLCLR 与 T-SQL 性能的研究,并在 Simple-Talk 上发布了结果。

      【讨论】:

        猜你喜欢
        • 2011-03-15
        • 2010-11-21
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多