Được giới thiệu ở đây bởi #sqlhelp trên Twitter (Giải quyết - Xem giải pháp ở cuối bài đăng).Tăng tốc Gói SSIS (Chèn và Cập nhật)
Tôi đang cố gắng tăng tốc gói SSIS chèn 29 triệu hàng dữ liệu mới, sau đó cập nhật các hàng đó với 2 cột bổ sung. Cho đến nay gói lặp lại thông qua một thư mục chứa các tệp, chèn các tệp phẳng vào cơ sở dữ liệu, sau đó thực hiện cập nhật và lưu trữ tệp. Đã thêm (nhờ @billinkc): thứ tự SSIS là Vòng lặp Foreach, Luồng dữ liệu, Thực hiện nhiệm vụ SQL, Tác vụ tệp.
Điều gì không mất nhiều thời gian: Vòng lặp, di chuyển tệp và cắt ngắn bảng (giai đoạn). Những gì diễn dài: chèn dữ liệu, chạy lệnh dưới đây này:
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
Lưu ý rằng tôi đã đùa giỡn với upping Hàng mỗi đợt trên chèn và Max chèn cam kết kích thước, nhưng không phải đã ảnh hưởng đến gói tốc độ.
Giải Quyết và Added:
Đối với những người quan tâm đến những con số: gói OP thời gian là phút 11,75; với kỹ thuật của William (xem dưới đây) nó giảm xuống còn 9,5 phút. Cấp, với 29 triệu hàng và trên một máy chủ chậm hơn, điều này có thể được mong đợi, nhưng hy vọng rằng cho bạn thấy dữ liệu thực tế đằng sau hiệu quả này là như thế nào. Điều quan trọng là giữ nhiều quá trình xảy ra trên nhiệm vụ Luồng dữ liệu nhất có thể, như dữ liệu cập nhật (sau luồng dữ liệu), tiêu thụ một phần thời gian đáng kể.
Hy vọng rằng sẽ giúp bất kỳ ai khác ngoài đó có vấn đề tương tự.
Cập nhật hai: Tôi đã thêm câu lệnh IF và giảm từ 9 phút xuống còn 4 phút. mã cuối cùng cho Execute SQL Nhiệm vụ:
-- 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
gói của bạn trông giống như một Foreach (file) Loop, Data Flow nhiệm vụ mà tiêu thụ tất cả các file nó tìm thấy và đẩy vào một bảng dàn. Sau khi tất cả được thực hiện, sau đó bạn có một thực thi nhiệm vụ SQL mà di chuyển dữ liệu từ dàn đến thực tế? Phần chậm có vẻ là nhiệm vụ thực thi SQL? Tôi đã hiểu vấn đề một cách chính xác chưa? – billinkc
Có, @billinkc. Order là Foreach Loop, Data Flow, thực hiện nhiệm vụ SQL, tác vụ tệp. Luồng dữ liệu và thực thi nhiệm vụ SQL tiêu tốn nhiều thời gian nhất (mặc dù, giới hạn tốc độ của luồng dữ liệu có thể tiến hành có thể tồn tại). – Tim
@ billinkc Dường như SQL của anh ta cũng nằm trong vòng lặp của anh ta, khi anh ta đang đi qua đường dẫn của tệp được xử lý vào trong SQL để lấy ngày và trạng thái. Vì vậy, có vẻ như vòng lặp Foreach chứa DataFlow và thực thi SQL và một nhiệm vụ Hệ thống tệp để lưu trữ các tệp đã xử lý. –