Để tóm tắt các chi tiết cụ thể: Chúng tôi cần đưa khoảng 5 triệu hàng vào cơ sở dữ liệu của nhà cung cấp (Oracle). Mọi thứ đều tuyệt vời đối với các lô 500 nghìn hàng sử dụng OracleBulkCopy
(ODP.NET), nhưng khi chúng tôi cố gắng tăng quy mô lên tới 5M, hiệu suất sẽ bắt đầu chậm khi thu thập thông tin khi chạm mốc 1M, chậm dần khi nhiều hàng được tải và cuối cùng Thời gian ra sau 3 giờ hoặc lâu hơn.
Tôi nghi ngờ nó có liên quan đến khóa chính trên bàn, nhưng tôi đã truy tìm các diễn đàn của Oracle và Stack Overflow để lấy thông tin và rất nhiều điều tôi đang đọc mâu thuẫn với điều đó (cũng, rất nhiều bài viết dường như mâu thuẫn với nhau ) . Tôi hy vọng rằng ai đó có thể thiết lập hồ sơ thẳng vào một số câu hỏi liên quan chặt chẽ về quy trình:
Là
OracleBulkCopy
lớp sử dụng tải thông thường hoặc đường dẫn trực tiếp? Có cách nào để tôi có thể xác nhận điều này, bằng cách này hay cách khác?Giả sử nó không sử dụng trực tiếp con đường tải: Có đúng là Oracle tự động cài đặt tất cả các chỉ số để sử dụng được trong thời gian tải và đặt chúng trở lại trực tuyến sau đó? Tôi đã đọc một số tuyên bố về hiệu ứng này nhưng một lần nữa, không thể xác nhận nó.
Nếu số 2 là đúng, thì nó có nên tạo ra bất kỳ sự khác biệt nào về các chỉ mục trên bảng trước khi tôi bắt đầu một hoạt động sao chép số lượng lớn không? Nếu vậy, tại sao?
Liên quan đến # 3, nói chung, có sự khác biệt thực tế nào không, giữa tải hàng loạt với chỉ số không sử dụng được so với thực tế giảm chỉ số trước khi tải và tạo lại sau đó?
Nếu # 2 là không chính xác, hoặc nếu có một số hãy cẩn thận tôi không hiểu, sau đó nó sẽ làm cho bất kỳ sự khác biệt cho rõ ràng làm cho chỉ số không sử dụng được trước khi tải số lượng lớn, và sau đó một cách rõ ràng xây dựng lại nó sau đó?
Có điều gì khác, ngoài việc xây dựng chỉ mục, có thể khiến hoạt động sao chép số lượng lớn tăng chậm dần khi ngày càng nhiều bản ghi được thêm vào không? (Có lẽ phải làm gì đó với việc đăng nhập, mặc dù tôi cho rằng các hoạt động hàng loạt không được ghi lại?)
Nếu thực sự không có cách nào khác để tăng hiệu suất để loại bỏ việc bỏ PK / chỉ mục trước, tôi có thể thực hiện các bước nào để đảm bảo rằng chỉ mục không biến mất hoàn toàn, tức là nếu mất kết nối với cơ sở dữ liệu Giữa quá trình?