在推特上通過#sqlhelp(已解決 - 查看帖子末尾的解決方案)。加速SSIS包裝(插入和更新)
我試圖加快插入2900萬行新數據的SSIS包,然後用2個額外的列更新這些行。到目前爲止,程序包通過包含文件的文件夾循環,將平面文件插入數據庫,然後執行更新並歸檔文件。 添加(感謝@ billinkc):SSIS順序是Foreach循環,數據流,執行SQL任務,文件任務。
什麼不需要很長的時間:循環,文件移動和截斷表(階段)。 什麼需要很長:插入數據,運行低於此聲明:
UPDATE dbo.Stage
SET Number = REPLACE(Number,',','')
## Heading ##
-- Creates temp table for State and Date
CREATE TABLE #Ref (Path VARCHAR(255))
INSERT INTO #Ref VALUES(?)
-- Variables for insert
DECLARE @state AS VARCHAR(2)
DECLARE @date AS VARCHAR(12)
SET @state = (SELECT SUBSTRING(RIGHT([Path], CHARINDEX('\', REVERSE([Path]))-1),12,2) FROM #Ref)
SET @date = (SELECT SUBSTRING(RIGHT([Path], CHARINDEX('\', REVERSE([Path]))-1),1,10) FROM #Ref)
SELECT @state
SELECT @date
-- Inserts the values into main table
INSERT INTO dbo.MainTable (Phone,State,Date)
SELECT d.Number, @state, @date
FROM Stage d
-- Clears the Reference and Stage table
DROP TABLE #Ref
TRUNCATE TABLE Stage
請注意,我已經在插件正在增加每批行和最大插入提交大小玩弄,但也影響了包速度。
解決並補充說:
對於那些有興趣在數字:OP包時間爲11.75分鐘;與威廉的技術(見下文),它下降到9.5分鐘。當然,在2900萬行和較慢的服務器上,這是可以預料的,但希望能夠向您顯示實際數據背後的效果。關鍵是要儘可能多地在數據流任務上發生進程,因爲更新數據(數據流之後)消耗了很多時間。
希望能夠幫助其他人解決類似問題。
更新二:我添加了一條IF語句,並將其從9分鐘縮短爲4分鐘。用於執行SQL任務的最終代碼:
-- Creates temp table for State and Date
CREATE TABLE #Ref (Path VARCHAR(255))
INSERT INTO #Ref VALUES(?)
DECLARE @state AS VARCHAR(2)
DECLARE @date AS VARCHAR(12)
DECLARE @validdate datetime
SET @state = (SELECT SUBSTRING(RIGHT([Path], CHARINDEX('\', REVERSE([Path]))-1),12,2) FROM #Ref)
SET @date = (SELECT SUBSTRING(RIGHT([Path], CHARINDEX('\', REVERSE([Path]))-1),1,10) FROM #Ref)
SET @validdate = DATEADD(DD,-30,getdate())
IF @date < @validdate
BEGIN
TRUNCATE TABLE dbo.Stage
TRUNCATE TABLE #Ref
END
ELSE
BEGIN
-- Inserts new values
INSERT INTO dbo.MainTable (Number,State,Date)
SELECT d.Number, @state, @date
FROM Stage d
-- Clears the Reference and Stage table after the insert
DROP TABLE #Ref
TRUNCATE TABLE Stage
END
你的包看起來像一個Foreach(文件)循環,消耗所有它找到的文件,並推入一個臨時表中的數據流任務。在完成所有工作之後,您將有一個執行SQL任務將數據從分段移動到實際?緩慢的部分似乎是執行SQL任務?我是否正確理解了這個問題? – billinkc
是的@billinkc。訂單是Foreach循環,數據流,執行SQL任務,文件任務。數據流和執行SQL任務消耗的時間最多(儘管限制數據流可能進行的速度可能存在)。 – Tim
@billinkc它看起來像他的SQL也在他的循環中,因爲他正在將處理文件的路徑傳遞到SQL以檢索日期和狀態。所以看起來Foreach循環包含DataFlow和Execute SQL以及文件系統任務來存檔處理過的文件。 –