在SQL 2005+中,CLR存储过程是否比TSQL存储过程更受青睐?

时间:2020-03-05 18:52:00  来源:igfitidea点击:

我当前的观点是不,更喜欢Transact SQL存储过程,因为它们的重量更轻并且(可能)具有更高的性能,而CLR过程使开发人员可以解决各种麻烦。

但是最近我需要调试一些写得很差的TSQL存储过程。像往常一样,我发现许多问题是由于最初的开发人员没有真正的TSQL经验,他们都是ASP.NET/Cfocused。

因此,使用CLR过程首先将为此类开发人员提供更为熟悉的工具集,其次,调试和测试功能会更强大(例如,Visual Studio而不是SQL Management Studio)。

我很想听听经历,因为这似乎不是一个简单的选择。

解决方案

回答

通常,如果我们不需要太多与数据库的接口,则可以使用CLR。因此,假设我们正在解析或者解码一个值。这在CLR中更容易完成,然后返回值。

尝试在CLR中执行compelx查询并不是走的路。

顺便说一句,这在2008年也没有改变。

回答

CLR存储过程无意替代基于集合的查询。如果需要查询数据库,则仍然需要将SQL放入CLR代码中,就像将其嵌入常规代码中一样。这将是浪费时间。

CLR存储过程主要用于两件事:1)与OS交互,例如从文件中读取消息或者在MSMQ中放入消息,以及2)执行复杂的计算,尤其是当我们已经用.NET语言编写的代码可以做计算。

回答

编写完善,经过深思熟虑的T-SQL和CLR都有很多地方。如果某些函数不经常调用,并且在SQL Server 2000中需要扩展过程,则可以选择CLR。在数据旁边运行诸如计算之类的事情可能也会很吸引人。但是通过引入新技术来解决糟糕的程序员听起来像是一个坏主意。

回答

它总是归结为正确的工具,因此它实际上取决于我们要完成的工作。

但是,通常来说,正确的是CLR proc具有更大的开销,并且永远不会在T-SQL之类的集合操作上执行。我的指导原则是在T-SQL中完成所有操作,除非我们需要的内容在T-SQL中变得过于复杂。然后,尽力使T-SQL方法起作用。 :-)

CLR proc很棒,并且确实有其位置,但是它们的使用应该是例外,而不是规则。

回答

在SQL Server中托管CLR的目的是为数据库开发人员提供更多灵活的选项,使其可以尝试完成任务。就像其他人提到的那样,SQL非常适合对数据集进行操作和修改。任何使用复杂的业务/域规则进行了大型应用程序开发的人都可能会告诉我们,尝试使用纯SQL强制执行其中一些规则(有时进入单个宏查询)可能会带来噩梦。

只有某些任务可以以过程或者OO方式更好地处理。通过选择使用.NET代码来分解逻辑顺序,查询操作可以更易于阅读和调试。使用了CLR存储的proc之后,我可以告诉我们逐步使用调试器确实可以更轻松地了解数据库级别的情况。

仅举一个例子,我们在这里经常使用CLR存储的proc作为动态搜索查询的"网关"。说一个搜索请求,最多可以包含30个不同的搜索参数。用户显然不使用全部30个参数,因此传入的数据结构将具有30个参数,但大多数为DBNULL。出于明显的安全原因,客户端没有选择生成动态语句的选项。生成的动态语句在内部生成,而无需担心外部"额外"。

回答

有关此主题的SQL Server联机丛书的页面列出了这些优点:

  • 更好的编程模型。 .NET Framework语言在很多方面都比Transact-SQL丰富,它提供了SQL Server开发人员以前不可用的结构和功能。开发人员还可以利用.NET Framework库的功能,该库提供了广泛的类集,可用于快速有效地解决编程问题。
  • 改善安全性。托管代码在由数据库引擎托管的公共语言运行时环境中运行。 SQL Server利用此功能来提供SQL Server早期版本中可用的扩展存储过程的更安全,更安全的替代方法。
  • 能够定义数据类型和聚合函数。用户定义的类型和用户定义的聚合是两个新的托管数据库对象,它们扩展了SQL Server的存储和查询功能。
  • 通过标准化环境简化开发。数据库开发已集成到Microsoft Visual Studio .NET开发环境的未来版本中。开发人员使用与编写中间层或者客户端层.NET Framework组件和服务相同的工具来开发和调试数据库对象和脚本。
  • 改进性能和可伸缩性的潜力。在许多情况下,.NET Framework语言编译和执行模型提供了比Transact-SQL更高的性能。

回答

我相信这两个并不相等...适合彼此对抗。
CLR Integration应该逐步淘汰过去的"扩展存储过程"。我们的工作场所中有一些……本质上是处理/逻辑上的SQL数据块,这些数据很难/不可能通过传统的DB存储过程/ T SQL来完成。因此他们将其写为C ++ DLL中的扩展存储过程,可以类似地对其进行调用。
现在它们已被淘汰,而CLR集成将替代它们

  • 数据库存储过程:如果可以在T SQL存储过程中完成,请这样做。
  • CLR存储过程:如果逻辑太复杂或者繁琐而无法通过T SQL进行...如果它需要较少的CLR代码行来解决(字符串操作,复杂/自定义排序或者筛选等)方法。

回答

除了文件系统访问(CLR proc具有明显的优势)之外,我还将使用T-SQL proc。如果我们有特别复杂的计算,则可以将该代码放入CLR函数中,并从proc中调用它(udf是我发现CLR集成真正发挥作用的地方)。然后,我们可以为任务的特定部分获得CLR集成的好处,但可以将尽可能多的存储在proc逻辑中的信息保留在DB中。

回答

根据我们所说的,我希望我们对开发人员进行一般的t-SQl和数据库培训,而不是允许他们在CLR中执行t-sql任务,从而对性能造成更大的损害。不了解数据库的开发人员以此为借口,避免以最适合数据库性能的方式进行操作,因为他们想采取他们认为更简单的方法。