SQLCLR中的验证功能及其性能

时间:2012-04-13 10:54:26

标签: c# .net sql-server-2008-r2 sqlclr

插入新行后,我必须立即验证表中的所有数据行。

DETAILS :插入表中的每一行都应该通过一组验证规则,这些规则可能会根据行中的数据而有所不同。 用c#编写时,它看起来像小应用程序。因此,我不打算将其作为单独的应用程序编写,而是将其编写为SQLCLR,以便调用这些SQLCLR编写的验证规则。

这是我第一次使用/探索SQLCLR,所以我担心性能是否会下降。 我正在做一些事情,比如将c#应用程序转换为SQLCLR应用程序。

请使用上述方案向我推荐sqlClr的性能。

先谢谢

1 个答案:

答案 0 :(得分:1)

如果没有关于需要对数据进行哪些验证的任何具体示例,这是一个非常普遍的问题,这使得除了广义推荐之外更难以提供任何内容。到目前为止,这里有一些关于SQLCLR(或SQL Server中的CLR功能)与T-SQL的一般信息:

  • 直接T-SQL 总是比a CLR例程执行相同的操作。 T-SQL是一种数据语言 并不一定最适合做字符串操作或其他 它有功能的东西。我发表了一个相当详细的分析 关于这个问题的简单谈话: http://www.simple-talk.com/sql/t-sql-programming/clr-performance-testing/

  • 只能通过SQL检索或操作数据,因此没有真正的好处 如果你不去,只需用.Net语言包装SELECT或DML语句 也可以在直接T-SQL中进行不那么快或甚至不可能的计算。 SQLCLR例程仍然需要打开数据库连接才能进行交互 与数据库对象(表,视图等),即使您正在使用 context_connection,如果代码只执行直接T-SQL SqlCommand,然后这个是一个糟糕的设计/使用SQLCLR。

  • 不应将SQLCLR视为 替代T-SQL。需要将其作为一种可以提供帮助的工具 你在某些地方要么操作效率较低 在T-SQL中甚至不可能。有时可以扩展功能 通过使用sp_OACreate等,但它有自己的问题。我发现它最好 有一些中间地带,某些算法不容易或不可能 或者通过用户定义从TNet到T-SQL的高效率 您从T-SQL代码调用的函数和存储过程。我创造了一个 执行此操作的函数和过程库,称为SQL# (SQLsharp)大部分是免费的,可以在http://www.SQLsharp.com/

  • 找到


考虑到所有这些,你的情况:

  

我必须尽快验证表中的所有数据行   插入。
  ...
  插入表中的每一行都应该通过一组   验证规则,这些规则可能会根据其中的数据而有所不同   行。

听起来它最适合在表上使用常规T-SQL INSERT,UPDATE触发器,该触发器使用直接T-SQL和某些SQLCLR例程(取决于所做的特定验证)对“插入”的组合“表。再次,根据您用于验证的特定算法,对于那些在CLR中做得更好的算法,您可以通过将其中一些算法组合到一个.Net例程中来获得一些效率,以降低调用该算法的启动成本。外部常规。

当然,触发器是否最佳取决于INSERT和UPDATE的频率以及正在进行的验证次数,以及几年内表中将有多少行。如果DML频率非常高和/或存在大量行,则可能是断开连接的方法更好,但这不会改变关于如何实现验证算法的建议。如果验证需要花费太长时间(您不希望将DML操作拖得太长并导致阻塞),那么您可以使用触发器将键值存储在SQL的单独队列表中工作可以每隔几分钟处理一次并决定是否保留。

正如我在一开始所说的那样,验证的例子可以提供关于最佳处理每种算法的最佳建议,但希望这些信息能够为您提供做出更好决策所需的信息。

请记住,只有通过测试才能知道哪种方法对于任何特定算法都更快!