2011-07-01 48 views
5

Ứng dụng C# .NET của tôi ghi hàng triệu bản ghi vào bảng tạm thời bằng OracleBulkCopy. Mỗi khi ứng dụng có 20000 bản ghi hoặc nhiều hơn trong bộ nhớ, nó gọi OracleBulkCopy để viết tất cả chúng trong một lô (tôi đang sử dụng kích thước lô = 0). Lúc đầu bảng trống và chỉ mất 2 giây để viết toàn bộ lô. Trong suốt quá trình, thời gian viết hàng loạt tăng lên. Sau 2.000.000 bản ghi mỗi cuộc gọi mất gần 25 giây. Tôi đang sử dụng các tùy chọn mặc định của OracleBulkCopy. Làm một số bài kiểm tra khi bảng đạt 40.000.000 phải mất gần 3 phút để viết 20.000 hồ sơ.Hiệu suất của OracleBulkCopy

Tôi muốn biết nếu có bất kỳ đề xuất nào (tôi không thể tìm thấy bất kỳ điều gì về nó) để duy trì thời gian gần như không đổi cho mỗi cuộc gọi. Tôi có làm gì sai không?

+0

Bạn có một số trình kích hoạt chèn trên bảng này không? – Nate

+1

Không, không có gì. Thậm chí không phải là một khóa chính. Và bảng được đặt để không đăng nhập. –

+0

Bảng "temp" chính xác có nghĩa là gì? Bảng tạm thời toàn cầu? – DCookie

Trả lời

3

Có vẻ như hành vi lạ. Bạn đã truy tìm phiên cơ sở dữ liệu đang thực hiện chèn để xem nó đang chờ gì chưa?

ALTER SESSION SET timed_statistics=TRUE; 
ALTER SESSION SET max_dump_file_size=UNLIMITED; 
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; 

99 lần trong số 100, kết quả theo dõi sẽ chỉ cho bạn vấn đề trong những trường hợp chậm chạp này.

+1

Vấn đề là khóa chính. Tôi chắc chắn rằng bảng đã được tạo mà không có khóa chính. Sử dụng tệp theo dõi, chúng tôi đã quan sát hàng nghìn lần đọc tuần tự trên khóa chính. Loại bỏ nó dẫn đến thời gian gần như không đổi 0,8 giây cho mỗi mẻ. –

+0

Rất vui khi bạn tìm thấy nó và Dấu vết SQL tìm thấy một vấn đề khác. Nếu mọi thứ diễn ra chậm, thì Dấu vết SQL luôn là điều đầu tiên cần thử. –