最近正在處理乙個合併字元呂的儲存過程,在乙個測試系統的開發中,要使用到字串合併功能,直接在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...