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