2011-06-13 121 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