缓慢的SQL Server CLR聚合
|
我总是发现缺少一个内置的聚合函数,该函数只是使用某些用户定义的分隔符将值串在一起,这令人沮丧。
我知道的最接近的东西是XML hack:
select s.string as [text()]
from strings s
for xml path(\'\')
但是我认为这是一种非常奇怪的方式,您仍然必须使用尾随的或领先的分隔符来处理该案件。所以,我以为我会写一个CLR聚合:
select dbo.Fold(s.string, \', \')
from strings s
很好。除了当行数达到5000时,这件事不能很好地执行。我真的不希望对那么多的数据运行它,但是令我惊讶的是,随着数据集的增长,聚合的性能下降得很快。起初我不明白为什么,然后我意识到问题在于SQL Server中处理UDF的方式。
我正在使用带有StringBuilder
类的UDF,因此我必须实现IBinarySerialize
。但是由于种种原因,我不理解SQL Server在每次Accumulate
迭代之间都调用Write / Read对。显然,当字符串变大时,这会导致性能问题。无论如何,要避免这种昂贵的序列化?
仅供参考,XML hack快几个数量级。
没有找到相关结果
已邀请:
1 个回复
曝匿弄罚