Tôi cần tải lên tệp CSV lớn (16GB, 65+ triệu bản ghi) vào một bảng trong cơ sở dữ liệu SQL Server 2005. Có ai có bất kỳ con trỏ trên cách tốt nhất để làm điều này?Tải tệp CSV lớn lên cơ sở dữ liệu SQL Server
Chi tiết
Tôi hiện đang sử dụng một C# giao diện điều khiển ứng dụng (.NET framework 2.0) để phân chia các tập tin nhập khẩu vào các tập tin của 50000 hồ sơ, sau đó xử lý mỗi file. Tôi tải lên các bản ghi vào cơ sở dữ liệu từ ứng dụng giao diện điều khiển bằng cách sử dụng lớp SqlBulkCopy theo lô 5000. Để tách các tệp mất khoảng 30 phút và tải lên toàn bộ tập dữ liệu (65+ triệu bản) mất khoảng 4,5 giờ. Kích thước tệp được tạo và kích thước tải lên hàng loạt đều là cài đặt cấu hình và tôi đang điều tra tăng giá trị của cả hai để cải thiện hiệu suất. Để chạy ứng dụng, chúng tôi sử dụng một máy chủ lõi tứ với RAM 16 GB. Máy chủ này cũng là máy chủ cơ sở dữ liệu.
Cập nhật
Với câu trả lời cho đến nay, xin lưu ý rằng trước khi nhập khẩu:
- Bảng cơ sở dữ liệu là cắt ngắn, và tất cả các chỉ số và hạn chế được giảm xuống.
- Cơ sở dữ liệu bị thu hẹp và không gian đĩa được khôi phục.
Sau khi đã nhập xong:
- Các chỉ số được tái
Nếu bạn có thể đề nghị bất kỳ phương pháp khác nhau, hoặc cách chúng tôi có thể cải thiện các ứng dụng nhập khẩu hiện có, tôi sẽ đánh giá cao nó . Cảm ơn.
Câu hỏi liên quan
Câu hỏi sau đây có thể được sử dụng cho những người khác đối phó với vấn đề này:
Giải pháp
tôi đã điều tra các ảnh hưởng của việc thay đổi kích cỡ lô, và kích thước của các tệp phân tách, và thấy rằng các lô của 500 bản ghi và chia nhỏ 200.000 bản ghi hoạt động tốt nhất cho ứng dụng của tôi. Việc sử dụng số SqlBulkCopyOptions.TableLock
cũng đã giúp ích. Xem câu trả lời cho số này question để biết thêm chi tiết.
Tôi cũng đã xem xét sử dụng gói SSIS DTS và tập lệnh SQL BULK INSERT
. Gói SSIS xuất hiện nhanh hơn, nhưng không cung cấp cho tôi khả năng ghi lại các bản ghi không hợp lệ, vv Tập lệnh SQL BULK INSERT
trong khi chậm hơn gói SSIS, nhanh hơn đáng kể so với ứng dụng C#. Nó đã cho phép tôi ghi lại các lỗi, vv, và vì lý do này, tôi chấp nhận câu trả lời BULK INSERT
từ ConcernedOfTunbridgeWells làm giải pháp. Tôi biết rằng đây có thể không phải là câu trả lời hay nhất cho mọi người đối mặt với vấn đề này, nhưng nó giải đáp được vấn đề trước mắt của tôi.
Nhờ mọi người đã trả lời.
Kính trọng, MagicAndi
Đó là những gì lớp SqlBulkCopy làm. –
Không hoàn toàn đúng. SqlBulkCopy kết thúc tốt đẹp API tải hàng loạt OLEDB mà vẫn đang đẩy dữ liệu qua liên kết máy khách-máy chủ. BULK INSERT chạy trong quá trình trên máy chủ. – ConcernedOfTunbridgeWells
ConcernedOfTurnbridgeWells, Cảm ơn câu trả lời +1. Tôi kiểm tra giải pháp của bạn và để lại một số phản hồi càng sớm càng tốt. – MagicAndi