Sql Server中三種字串合併方法的效能比較

2021-06-26 01:30:23 字數 3644 閱讀 2999

最近正在處理乙個合併字元呂的儲存過程,在乙個測試系統的開發中,要使用到字串合併功能,直接在sql中做。

示例:有表內容﹕

名稱  內容

1     abc

1      aaa

1      dddd

2      1223

2       fkdjfd

--------------------------------

結果﹕1   abc,aaa,dddd

2   1223,fkdjfd

要求用一條sql語句實現﹐如﹕select sum(內容) from table group by 名稱

--該問題,一共使用了三種方法,並分別測試了一下這三種方法的各自的效能

1: 建立處理函式

2 :  sql 2005及以上版本中的新的解決方法,for xml

3 :  使用臨時表實現字串合併處理的示例

說明:以下測試是以本人機器的硬體配置為準,根據硬體配置的不同,結果可能不同。

1: 建立處理函式

說明:sql 全系列版本

create function dbo.f_strhebin(@id int)

returns varchar(8000)

asbegin

declare @r varchar(8000)

set @r = ''

select @r = @r + ',' + value

from tb

where id=@id

return stuff(@r, 1, 1, '')

endgo

-- 呼叫函式

select id, values=dbo.f_strhebin(id)

from tb

group by id

以上方式得到的是根據id合併的所有記錄,如果要得到相應的單一id的記錄,則還需要新增一條語句:

假設:以上結果入到臨時表3t3中:

select id,max(values) as values from #t3 group by id

go分析結果如下:

cpu 時間 = 0 毫秒,占用時間 = 7 毫秒。

1--使用sql 全系列版本,自定義合併函式方式

cpu 時間 = 0 毫秒,占用時間 = 0 毫秒。

表 'worktable'。掃瞄計數 1,邏輯讀取 4030 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 'tb'。掃瞄計數 2,邏輯讀取 46 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

cpu 時間 = 1397254 毫秒,占用時間 = 1463680 毫秒。

(1969 行受影響)

(218 行受影響)

表 'worktable'。掃瞄計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 '#t3___000067'。掃瞄計數 1,邏輯讀取 16 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

cpu 時間 = 0 毫秒,占用時間 = 84 毫秒。

cpu 時間 = 0 毫秒,占用時間 = 2 毫秒。

總計耗時計:24.4分鐘,這才1969行記錄,這個方法看來在這種情況下不可取。

2 :  sql 2005及以上版本中的新的解決方法,for xml

select id,stuff(

(select '-' + convert(varchar(4),value)

from tb

where id=a.id

order by id

for xml path('')

),1,1,'') as values

from tb a

group by   id

go分析結果如下:

cpu 時間 = 0 毫秒,占用時間 = 0 毫秒。

cpu 時間 = 0 毫秒,占用時間 = 0 毫秒。

表 'worktable'。掃瞄計數 439,邏輯讀取 32978 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 319 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 'tb'。掃瞄計數 4,邏輯讀取 92 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

cpu 時間 = 1856 毫秒,占用時間 = 1955 毫秒。

總計耗時:2秒鐘。不過這個方法隨著記錄數量的增加,效能也隨之降低,在資料記錄達到20000條的時候,耗時將近2.5分鐘。

3 :  使用臨時表實現字串合併處理的示例

select id ,values=cast(value as varchar(8000))

into #t2 from tb

order by id

declare @col1 varchar(5),@col2 varchar(8000)

update #t2 set

@col2=case when @col1=id then @col2+'-'+values else values end,

@col1=zo3,

qs=@col2

select id,max(values) values from #t2 group by id

drop table #t2

go分析結果如下:

cpu 時間 = 7 毫秒,占用時間 = 7 毫秒。

cpu 時間 = 0 毫秒,占用時間 = 0 毫秒。

表 'worktable'。掃瞄計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 'tb'。掃瞄計數 2,邏輯讀取 46 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

cpu 時間 = 734 毫秒,占用時間 = 769 毫秒。

(2012 行受影響)

表 '#t2___________000000000065'。掃瞄計數 1,邏輯讀取 1677 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

cpu 時間 = 62 毫秒,占用時間 = 62 毫秒。

(2012 行受影響)

表 '#t2__________000000000065'。掃瞄計數 1,邏輯讀取 849 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

cpu 時間 = 16 毫秒,占用時間 = 7 毫秒。

(218 行受影響)

cpu 時間 = 0 毫秒,占用時間 = 1 毫秒。

cpu 時間 = 0 毫秒,占用時間 = 0 毫秒。

總計耗時:769ms+62ms+15ms=846ms,總費時1秒鐘不到,當資料記錄達到20000條記錄時,效能損耗也不太嚴重,在6-10秒左右。能夠接受。

Sql Server中三種字串合併方法的效能比較

最近正在處理乙個合併字元呂的儲存過程,在乙個測試系統的開發中,要使用到字串合併功能,直接在sql中做。示例 有表內容 名稱 內容 1 abc 1 aaa 1 dddd 2 1223 2 fkdjfd 結果 1 abc,aaa,dddd 2 1223,fkdjfd 要求用一條sql語句實現 如 sel...

Sql Server中三種字串合併方法的效能比較

最近正在處理乙個合併字元呂的儲存過程,在乙個測試系統的開發中,要使用到字串合併功能,直接在sql中做。示例 有表內容 名稱 內容 1 abc 1 aaa 1 dddd 2 1223 2 fkdjfd 結果 1 abc,aaa,dddd 2 1223,fkdjfd 要求用一條sql語句實現 如 sel...

Java中三種方法拼接字串時間比較

package opt string 比較三種方法拼接時間 author administrator public class mystring 比較三種拼接字串的時間 static void testbigstring long e1 system.currenttimemillis system...