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ư
Ý 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 Row
từ 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.