0

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

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

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

请就上述场景的 sqlClr 性能向我提出建议。

提前致谢

4

1 回答 1

2

如果没有任何具体示例说明需要对数据进行哪些验证,这是一个非常笼统的问题,因此很难给出比笼统的建议更多的内容。至此,这里有一些关于 SQLCLR(或 SQL Server 中的 CLR 功能)与 T-SQL 的一般信息:

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

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

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


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

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

听起来它最适合在表上使用常规 T-SQL INSERT、UPDATE 触发器,该触发器使用直接 T-SQL 和一些 SQLCLR 例程(取决于正在进行的特定验证)对“插入”表的组合。同样,根据您用于验证的特定算法,对于那些在 CLR 中做得更好的算法,您可能会通过将其中一些算法组合到单个 .Net 例程中来提高效率,从而降低调用外部常规。

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

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

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

于 2012-04-20T18:15:17.003 回答