2012-02-02 9 views
8

Tôi thấy một số khác biệt hiệu suất đáng kể giữa OracleBulkCopy (ODP.NET) và SQL * Loader khi máy chủ Oracle nằm trên một máy khác.OracleBulkCopy vs SQL * Hiệu suất bộ tải

Tôi có một bảng rất cơ bản trong Oracle với ba cột (một BINARY_FLOAT, hai SỐ (18,0)). Không có khóa chính, chỉ mục, trình kích hoạt, vv Nó được sử dụng như một bảng dàn để lấy dữ liệu hàng loạt vào DB.

Trình tải SQL * mất khoảng 27 giây để tải 4,5 triệu hàng vào bảng.

OracleBulkCopy mất khoảng 10 phút để tải chỉ 1 triệu hàng.

OracleBulkCopy, theo tài liệu, * "... sử dụng phương pháp tải đường dẫn trực tiếp, tương tự như, nhưng không giống như Oracle SQL * Loader." * Nó có thể không ở trên đó với Trình tải SQL * về hiệu suất, nhưng sự khác biệt này là vô lý.

Sau một số phân tích cơ bản về lưu lượng mạng, tôi thấy OracleBulkCopy đang gửi và nhận một số lượng lớn các gói nhỏ. Tôi đã sử dụng Wireshark để so sánh các gói cho mỗi và tìm thấy một số kết quả thú vị.

SQL * Loader - sau khi bắt tay kết nối ban đầu - Đưa ra một loạt các 8 kilobyte gói (giao thức TNS) và nhận 60 byte ACK trong phản ứng.

OracleBulkCopy gửi một loạt các 102 byte gói (giao thức TNS) và nhận được một 133 byte gói (TNS protocol) để đáp ứng. Cai gi...!? Nó giống như nó đang gửi một hàng tại một thời điểm!

Với lớp OracleBulkCopy, tôi đang sử dụng kích thước lô 100.000 và giờ bằng cách sử dụng tùy chỉnh IDataReader để đọc từ tệp dữ liệu.

Vì vậy, câu hỏi của tôi là:

  • Có ai đã từng nhìn thấy hành vi này?

  • OracleBulkCopy có thực sự hoạt động như một công cụ tải hàng loạt không?

  • Có điều gì tôi cần phải định cấu hình để hoạt động bình thường không? (cài đặt máy khách/máy chủ, v.v.)

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Tôi có thời gian chèn tương tự bằng cách sử dụng dữ liệu. Thậm chí tệ hơn, một vài cột là loại dấu thời gian vì vậy tôi phải thiết lập cột datatable thành một kiểu OracleTimeStamp mà dường như có một hit tốt khi tôi hồ sơ ứng dụng. Bạn có thể nhận được bản sao hàng loạt được tăng tốc không? Popping ra lệnh để chạy sqlloader có vẻ như một cách thực sự nghèo để xử lý các tập tin lớn trên một máy chủ web! – Dan

Trả lời

4

Tôi đã nhận được phản hồi từ Alex Keh, Giám đốc sản phẩm Oracle, rằng Oracle "cũng đã nhận thấy vấn đề này. Chúng tôi đang đánh giá cách khắc phục lỗi này".

Vì vậy, để trả lời các câu hỏi của riêng tôi, tôi đoán OracleBulkCopy có không hoạt động tốt như một công cụ tải hàng loạt. Ít nhất là không phải lúc này.

Tôi sẽ gói SQL * Loader làm giải pháp thay thế vì không có ETA sửa lỗi.

+0

Vì tò mò, bạn đã thử [array binding] (http://docs.oracle.com/html/B10961_01/features.htm#1025579)? –

+0

Có, chúng tôi sử dụng tính năng ràng buộc mảng cho hầu hết tải dữ liệu của chúng tôi. Tuy nhiên, trong trường hợp cụ thể này, chúng tôi đang tải hàng chục triệu hàng dữ liệu vào cơ sở dữ liệu và chúng tôi không cần nhiều logic xung quanh - chỉ tải nhanh và liên kết mảng không đủ nhanh. –

+0

@AdrianBrown - Nếu bạn vẫn đang theo dõi chuỗi này, bạn có nhớ phiên bản nào và nếu có bất kỳ cập nhật nào về sửa lỗi không? – Leigh

1

Sự cố này có xảy ra khi sử dụng DataTable làm nguồn không? Hay là do việc sử dụng IDataReader?

+0

Câu hỏi hay. Có, tôi đã thử sử dụng DataTable. Tôi nghĩ rằng nó có thể có một cái gì đó để làm với streaming của IDataReader, nhưng tôi đã nhận chính xác cùng một hành vi. Nó chỉ sử dụng nhiều bộ nhớ hơn. :) –