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