2012-11-19 37 views
5

Đượ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 
+0

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

+0

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

+0

@ 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ý. –

Trả lời

5

Theo tôi được biết, bạn đang Đọc ~ 29.000.000 hàng từ các tập tin phẳng và viết chúng vào một bảng dàn dựng, sau đó chạy một kịch bản sql rằng bản cập nhật (đọc/viết) cùng 29.000.000 hàng trong bảng dàn dựng, sau đó di chuyển 29.000.000 bản ghi đó (đọc từ dàn dựng rồi viết thành nat) đến bảng cuối cùng.

Bạn không thể đọc từ tệp phẳng của mình, sử dụng truyền SSIS để làm sạch dữ liệu và thêm hai cột bổ sung, sau đó viết trực tiếp vào bảng cuối cùng. Sau đó, bạn sẽ chỉ làm việc trên từng bộ dữ liệu riêng biệt một lần thay vì ba (sáu nếu bạn đếm số lần đọc và ghi riêng biệt) mà quy trình của bạn thực hiện?

Tôi sẽ thay đổi luồng dữ liệu của bạn để biến đổi trong quá trình các mục cần thiết và viết trực tiếp vào bảng cuối cùng của tôi.

chỉnh sửa

Từ SQL trong câu hỏi của bạn có vẻ như bạn đang chuyển đổi dữ liệu bằng cách loại bỏ của dấu phẩy từ lĩnh vực điện thoại, và sau đó lấy các NHÀ NƯỚC và ngày từ phần cụ thể của đường dẫn tập tin rằng hiện tệp được xử lý nằm trong, sau đó lưu trữ ba điểm dữ liệu đó vào bảng NAT. Những điều đó có thể được thực hiện với phép biến đổi cột có nguồn gốc trong luồng dữ liệu của bạn.

Đối với cột Nhà nước và Ngày, hãy thiết lập hai biến mới được gọi là Trạng thái và Ngày.Sử dụng các biểu thức trong định nghĩa biến để đặt chúng thành các giá trị chính xác (giống như bạn đã làm trong SQL của bạn). Khi biến Path cập nhật (trong vòng lặp của bạn, tôi giả định). các biến State và Date cũng sẽ cập nhật.

Trong Chuyển đổi cột có nguồn gốc, hãy kéo Biến trạng thái vào trường Biểu thức và tạo cột mới được gọi là Trạng thái.

Lặp lại cho ngày.

Đối với cột ĐIỆN THOẠI, trong transforamtion Cột nguồn gốc tạo ra một biểu thức như sau:

REPLACE ([Điện thoại], "", "")

Đặt lĩnh vực Cột nguồn gốc để Thay thế ' Điện thoại '

Để có kết quả đầu ra, hãy tạo đích đến bảng NAT của bạn và liên kết các cột Điện thoại, Trạng thái và Ngày trong luồng dữ liệu của bạn đến các cột thích hợp trong bảng NAT.

Nếu có thêm cột trong đầu vào của bạn, bạn có thể chọn không đưa chúng vào từ nguồn của bạn, vì có vẻ như bạn chỉ đang hành động trên cột Điện thoại từ dữ liệu gốc.

/chỉnh sửa

+0

Tôi đã xem xét một số phép biến đổi dữ liệu, nhưng không thấy bất cứ điều gì cho phép thao tác như tôi đang cần. Ví dụ, loại bỏ các cột có thể được thực hiện TRƯỚC KHI một chèn vào bất cứ điều gì, nhưng không có công cụ trong SSIS có thể làm điều đó. Đáng ngạc nhiên, thao tác dữ liệu (bên ngoài tập lệnh) bị hạn chế. – Tim

+1

Đáng ngạc nhiên, tôi thấy rằng không có nhiều tôi cần phải sử dụng một kịch bản cho. Nói chung, bất kỳ thao tác dữ liệu nào tôi cần thực hiện đều có thể được thực hiện với các biến đổi và biến có sẵn trong SSIS. Có rất ít trường hợp tôi cần phải quay trở lại trên một kịch bản. –

+0

Rất tiếc, đã xem bản chỉnh sửa - Tôi đang kiểm tra ý tưởng biến. – Tim

Các vấn đề liên quan