2011-06-13 94 views
3

我一直发现缺乏一个内置的聚合函数,只是使用某些用户定义的分隔符串在一起的值,令人沮丧。慢SQL Server CLR聚合

我知道的最接近的事是XML黑客:

select s.string as [text()] 
from strings s 
for xml path('') 

但在我看来这是做的一个非常奇怪的方式,你仍然必须处理尾随或领导分离垃圾的情况。所以,我想我会写一个CLR聚合:

select dbo.Fold(s.string, ', ') 
from strings s 

这样很好。当行数达到5000时,除了这个东西不能很好地执行。我并没有真正希望将它与那么多的数据进行比较,但是令我惊讶的是,随着数据集的增长,总体性能下降得相当迅速。我不明白为什么起初,我意识到在SQL Server中处理UDF的方式是个问题。

我使用的UDF类型为StringBuilder,因此我必须实现IBinarySerialize。但出于某些原因,我不明白SQL Server正在调用每次迭代Accumulate之间的Write/Read对。显然这会在字符串变大时产生性能问题。无论如何避免这种昂贵的序列化?如果你想使用这个XMLHack,那么这个XML Hack就是更快的数量级。

回答

1

你在做什么正在实施的MySQL GROUP_CONCAT

看到这些灵感...

就个人而言,我使用XML招。

+0

XML技巧似乎是在这个问题上的正确选择,它只是一个可怕的语法。 group_concat的东西在运行聚合时会维护频率表,我猜测它的性能同样糟糕,但这是一个有趣的方法。 – 2011-06-13 11:02:02