Re: [SQL ] 請問用迴圈與子查詢的效能問題

看板Database (資料庫)作者 (Suddenly I See)時間16年前 (2009/05/08 00:11), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串3/4 (看更多)
這裡的推文真令人抓狂啊..要等這麼多秒.. 超級感謝你提供另外一個寫法, 理論上應該比SUB QUERY快, 於是我剛剛心血來潮把你的寫法加了進去, 想要測試SUB QUERY跟你寫法的速度 結果我竟然發現差不多,雖然我只測了5次,資料筆數9000筆 也許我應該測個十次以上取平均值,或者增加資料筆數才能發現之間的差異 總之感謝你提供新寫法(總之,無論如何已經比回圈還快了,約增加3~4成效能) ※ 引述《evernever (NeverEver)》之銘言: : select *, 0 qty_sum into #temp from [Table] : order by part_no : declare @no char, @bal int : update #temp : set @bal = qty_sum = case when @no is null or @no <> part_no then qty : else qty + @bal end, : @no = part_no : Select * From #temp : -- 備註: @no 的 type 是要跟 part_no 一樣,我這裡先設 char : -- @bal 我設 int, 也是要跟 qty type 一樣 : ※ 引述《eggeggss (Suddenly I See)》之銘言: : : 小弟用的是MSSQL,希望做出累計的效果 : : 假設需要累計的資料高達十萬筆 : : 我的原始資料假設如下: : : id part_no qty : : 1 A 1 : : 2 A 2 : : 3 A 3 : : 4 B 2 : : 5 B 1 : : . : : . : : . : : 結果要變成 : : id part_no qty qty_sum(根據part_no的累計欄位) : : 1 A 1 1 : : 2 A 2 3 : : 3 A 3 6 : : 4 B 2 2 : : 5 B 1 3 : : . : : . : : . : : 於是我利用以下的sub query 可以達成達成目的 : : select part_no,qty_sum=(select sum(qty) from [某table] where id<a.id : : and part_no=a.part_no) : : from 某table a : : 因為之前的前輩在這段的寫法是利用回圈計算,(須繞十萬次,約一個小時), : : 小弟用profiler : : 發現整隻預儲程序的bottleneck就是這段計算 : : 希望能夠改寫前輩的寫法 : : 想請教 sub query與利用回圈計算累加何者效率會比較高 : : 小弟有稍微測試兩者的效能,似乎看不出何者較高(因為處於多工環境, : : server分配的資源不一定均等,所以無法做banch mark) : : 感激不盡 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.97.54

05/08 07:58, , 1F
這個做法慢是慢在一開始的 select .. into
05/08 07:58, 1F

05/08 08:04, , 2F
越多筆 subquery 應該越慢,可以試試上萬筆或全部 XD
05/08 08:04, 2F
文章代碼(AID): #1A0mX5rr (Database)
文章代碼(AID): #1A0mX5rr (Database)