Chế độ truy cập dữ liệu luồng dữ liệu SSIS - điểm của 'bảng hoặc chế độ xem' so với tải nhanh là gì?


9

Sử dụng SQL Server Business Development Studio, tôi thực hiện rất nhiều tệp phẳng cho luồng dữ liệu đích OLE DB để nhập dữ liệu vào các bảng SQL Server của mình. Trong "Chế độ truy cập dữ liệu" trong trình chỉnh sửa đích OLE DB, nó mặc định là "bảng hoặc dạng xem" thay vì "bảng hoặc dạng xem - tải nhanh". Sự khác biệt là gì; sự khác biệt rõ ràng duy nhất tôi có thể nhận thấy là tải nhanh chuyển dữ liệu nhanh hơn nhiều.

Câu trả lời:


13

Các chế độ truy cập dữ liệu của Thành phần đích OLE DB có hai loại - nhanh và không nhanh.

Nhanh, "bảng hoặc dạng xem - tải nhanh" hoặc "biến tên bảng hoặc dạng xem - tải nhanh" có nghĩa là dữ liệu sẽ được tải theo kiểu dựa trên tập hợp.

Chậm - hoặc "bảng hoặc dạng xem" hoặc "biến tên bảng hoặc dạng xem" sẽ dẫn đến SSIS ban hành các câu lệnh chèn đơn lẻ vào cơ sở dữ liệu. Nếu bạn đang tải 10, 100, thậm chí 10000 hàng, có lẽ có rất ít sự khác biệt về hiệu suất giữa hai phương thức. Tuy nhiên, tại một số điểm bạn sẽ bão hòa phiên bản SQL Server của mình với tất cả các yêu cầu nhỏ nhặt này. Ngoài ra, bạn sẽ lạm dụng cái chết trong nhật ký giao dịch của mình.

Tại sao bạn muốn các phương pháp không nhanh? Dữ liệu xấu. Nếu tôi đã gửi trong 10000 hàng dữ liệu và hàng thứ 9999 có ngày 2015 / 02-29, bạn sẽ có 10k chèn nguyên tử và cam kết / rollback. Nếu tôi đang sử dụng phương thức Nhanh, toàn bộ lô 10k hàng đó sẽ lưu hoặc không có gì trong số chúng. Và nếu bạn muốn biết (các) hàng nào bị lỗi, mức độ chi tiết thấp nhất bạn sẽ có là 10k hàng.

Bây giờ, có những cách tiếp cận để tải càng nhiều dữ liệu càng nhanh càng tốt và vẫn xử lý dữ liệu bẩn. Đó là một cách tiếp cận thất bại xếp tầng và nó trông giống như

xếp tầng thất bại chèn

Ý tưởng là bạn tìm đúng kích cỡ để chèn càng nhiều càng tốt trong một lần chụp nhưng nếu bạn nhận được dữ liệu xấu, bạn sẽ thử lưu lại dữ liệu theo từng đợt nhỏ hơn để đến các hàng xấu. Ở đây tôi đã bắt đầu với kích thước cam kết chèn tối đa (FastLoadMaxInsertCommit) là 10000. Trên phần xử lý Lỗi Hàng, tôi thay đổi nó thành Redirect Rowtừ Fail Component.

Điểm đến tiếp theo giống như trên nhưng ở đây tôi thử tải nhanh và lưu nó theo lô 100 hàng. Một lần nữa, kiểm tra hoặc thực hiện một số giả vờ đến với kích thước hợp lý. Điều này sẽ dẫn đến 100 lô 100 hàng được gửi bởi vì chúng tôi biết ở đâu đó trong đó, có ít nhất một hàng đã vi phạm các ràng buộc toàn vẹn cho bảng.

Sau đó, tôi thêm một thành phần thứ ba vào hỗn hợp, lần này tôi lưu theo lô 1. Hoặc bạn chỉ có thể thay đổi chế độ truy cập bảng từ phiên bản Tải nhanh vì nó sẽ mang lại kết quả tương tự. Chúng tôi sẽ lưu từng hàng riêng lẻ và điều đó sẽ cho phép chúng tôi thực hiện "một cái gì đó" với (các) hàng xấu duy nhất.

Cuối cùng, tôi có một điểm đến không an toàn. Có thể đó là bảng "giống" với đích dự định nhưng tất cả các cột được khai báo là nvarchar(4000) NULL. Bất cứ điều gì kết thúc tại bảng đó cần phải được nghiên cứu và làm sạch / loại bỏ hoặc bất kể quá trình giải quyết dữ liệu xấu của bạn là gì. Những người khác đổ vào một tệp phẳng nhưng thực sự, bất cứ điều gì có ý nghĩa đối với cách bạn muốn theo dõi dữ liệu xấu hoạt động.


5

Tải nhanh được ghi lại rõ ràng trong các tùy chọn NHANH CHÓNG

  • Giữ các giá trị nhận dạng từ tệp dữ liệu đã nhập hoặc sử dụng các giá trị duy nhất được gán bởi SQL Server.

  • Giữ lại một giá trị null trong hoạt động tải số lượng lớn.

  • Kiểm tra các ràng buộc trên bảng đích hoặc chế độ xem trong hoạt động nhập hàng loạt.

  • Có được một khóa cấp bảng trong suốt thời gian của hoạt động tải số lượng lớn. Chỉ định số lượng hàng trong lô và kích thước cam kết.


Sự khác biệt là gì; sự khác biệt rõ ràng duy nhất tôi có thể nhận thấy là tải nhanh chuyển dữ liệu nhanh hơn nhiều.

Trong phần mềm này, table or viewsẽ sử dụng Lệnh SQL riêng lẻ cho mỗi hàng để chèn vs table or view - with fast loadsẽ sử dụng lệnh BULK INSERT.

Nếu bạn thấy các tùy chọn ở trên có sẵn trong BULK INSERT, ví dụ number of rows in the batch= ROWS_PER_BATCHcommit size=BATCHSIZE

Một kịch bản khác sẽ là ..

Kích thước cam kết chèn tối đa mặc định (2147483647) quá cao. Vì vậy, ví dụ: bạn đang chèn 500K hàng và do vi phạm PK, lô không thành công. Trong trường hợp này, toàn bộ lô sẽ thất bại khi bạn sử dụng tùy chọn NHANH CHÓNG. Bạn sẽ không thể có được mô tả lỗi là tốt.

Đây là nơi bạn có thể có table or viewđầu ra Lỗi đích. Vì vậy, trong số 500K, bạn sử dụng NHANH CHÓNG như bắt đầu với kích thước cam kết chèn là 5K. Nếu 1 hàng trong lô đó không thành công, bạn sẽ chuyển hướng lô 5K đó để table or viewtải - sử dụng CHỈ theo hàng cho CHỈ 5K hàng và bạn cũng có thể chuyển hướng lỗi table or viewsang tệp phẳng .. để nếu bất kỳ hàng nào thất bại trong lô đó nếu 5K, bạn sẽ có thể xác định chính xác nguyên nhân gây ra lỗi.

Ưu điểm của phương pháp trên là nếu không có hàng nào thất bại, thì nó sẽ sử dụng BULK INSERT (tải nhanh) cho toàn bộ lô.

Billinkc SSIS aficionado đã trả lời một câu hỏi tương tự trên Stackoverflow .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.