此处由 Twitter 上的#sqlhelp 引用(已解决 - 请参阅帖子末尾的解决方案)。
我正在尝试加速插入 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