Cursor 可以怎麼改善效能?從自我參照到集合運算的幾種改善方式
上篇提到,一段看起來沒有問題的 Cursor,因為同時「從同一張表讀資料,又寫回同一張表」,最後讓資料量一路膨脹,效能也跟著快速惡化;理解原因之後,接下來要探討的是:如果接手這樣的問題,該怎麼調整或修改? 可以怎麼調整? 拆出獨立的「來源表」,把自我參照分開 修改幅度最小的做法;把母體先複製到另一張暫存表,Cursor 從來源表讀、寫入目標表,兩者不會混在一起: 1-- 先把「會員母體」獨立出來 2SELECT DISTINCT member_id, member_name, member_level 3INTO #member_source 4FROM #member_base; 5 6-- 清空目標表(如果需要的話) 7TRUNCATE TABLE #member_base; 8 9DECLARE month_cursor CURSOR FOR SELECT month_id FROM dim_month; 10OPEN month_cursor; 11FETCH NEXT FROM month_cursor INTO @month_id; 12 13WHILE @@FETCH_STATUS = 0 14BEGIN 15 INSERT INTO #member_base (member_id, member_name, member_level, month_id, amount) 16 SELECT member_id, member_name, member_level, @month_id, 0 17 FROM #member_source; -- 來源固定,不會膨脹 18 19 FETCH NEXT FROM month_cursor INTO @month_id; 20END 21 22CLOSE month_cursor; 23DEALLOCATE month_cursor; 24DROP TABLE #member_source; 這個改法只處理了「資料爆炸」的部分,Cursor 本身的效能成本還在;不過如果業務邏輯比較複雜、確實需要逐筆處理,這算是相對安全的最小改動。 ...