使用CLR存储过程解决哪些好问题?

Tj *_*lie 16 .net c# vb.net sql-server sqlclr

我已经在SQL服务器中使用了CLR存储过程一段时间了,但我仍然想知道使用它们的最佳情况是什么.

MSDN提供了一些使用指南,如重字符串操作(正则表达式),或替换声明了许多表变量和游标的T-SQL.我很想知道用户使用CLR存储过程解决了哪些问题,以及示例/基准测试.

例如,我发现CLR存储过程+ SSRS是一种很好的方法,可以将数据操作逻辑从SSRS和T-SQL中分离出来,并变成易于读取和操作的托管代码.

Aar*_*ght 23

需要非规范化和/或顺序操作的许多问题可以通过CLR非常好地处理,并且可以用于显着提高性能而不会牺牲SQL端的可用性(很多).您可以采用混合方法,对大型运输使用基于集合的解决方案,并切换到紧密循环的迭代模型,而不是完全依赖基于集合或迭代的操作.

SQL Server 2008中的内置hierarchyid和地理空间(即geography)类型是非规范化问题的很好的例子.两者都包含(几乎)任意大量的数据,这些数据难以在不损害性能的情况下进行标准化 - 您需要使用递归或游标来与它们进行任何有意义的工作,或者使用鼠标的触发器和/或计划任务来维护一个非规范化表.

我用CLR类型解决的另一个问题是内联压缩.这可能听起来像是一个毫无意义的或学术性的练习,但是当你的完全标准化数据进入太字节时,大小减少80-90%就意味着很多.SQL现在有自己的内置压缩,SQL 2005有vardecimal,这些也是很好的工具,但是在CPU负载和压缩率方面,域感知"最小化"算法的效率要高几倍.显然这并不适用于所有问题,但它适用于某些问题.

此网站上经常出现的另一个非常常见的问题是即时生成序列 - 例如一系列连续日期.常见的解决方案是递归CTE,静态序列表和鲜为人知的spt_values表,但是简单的CLR UDF比其中任何一个都表现得更好,并且提供了更大的灵活性.

最后在我的列表中:用户定义的流聚合也非常有用,特别是对于任何与统计相关的内容.有些事情你根本无法从内置的SQL聚合中组成,例如中位数,加权移动平均数等.UDAs也可以使用多个参数,这样你就可以对它们进行参数化; 从技术上讲,聚合不能保证在当前版本的SQL Server中以任何特定顺序接收数据,但是您可以通过将其ROW_NUMBER作为附加参数提供来解决该限制,并使用它来实现任何窗口函数(具有聚合吐出UDT然后可以转换为表格.

实际上非常令人沮丧的是,真正有用的SQL-CLR应用程序的例子很少; 在Google上搜索,你会获得1000万个结果,每一个结果都是一些愚蠢的字符串连接或正则表达式.这些很有用,但需要花几分钟时间来了解SQL UDT和UDA,您将开始在自己的应用程序中看到它们的大量用途.当然,不要疯狂 - 仔细考虑是否在纯SQL中有更好的解决方案 - 但也不要打折它们.

  • 这是我读过的内容最丰富的帖子之一.谢谢. (2认同)

Ode*_*ded 5

字符串操作 - 正则表达式搜索是经典的.在CLR中很容易暴露,在直接的T-SQL中很难做到.

有关实施和微观基准()的详细信息,请参阅此链接SQLCLR is only 47 milliseconds compared to 6.187 seconds for the T-SQL UDF.


mar*_*c_s 5

已经提到了字符串操作(正则表达式),但也提到了DateTime算法,当然还有另一个重要的 - 调用外部Web服务.