Twitter の #sqlhelp で参照されています (解決済み - 投稿の最後にある解決策を参照してください)。
2,900 万行の新しいデータを挿入し、それらの行を 2 つの追加の列で更新する SSIS パッケージを高速化しようとしています。これまでのところ、パッケージはファイルを含むフォルダーをループし、フラット ファイルをデータベースに挿入し、更新を実行してファイルをアーカイブします。 追加 (@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 分でした。William の手法 (この下を参照) を使用すると、9.5 分に短縮されます。確かに、2,900 万行で低速のサーバーでは、これは予想できますが、うまくいけば、これがどれほど効果的であるかの背後にある実際のデータを示しています。重要なのは、(データ フローの後の) データの更新にかなりの時間が費やされるため、データ フロー タスクでできるだけ多くのプロセスを実行し続けることです。
うまくいけば、それが同様の問題を抱えている他の誰かに役立つことを願っています。
更新 2: 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