2011-08-17 22 views
5

Trong vài ngày qua, tôi đã chơi xung quanh với Trình tải SQL * của Oracle để cố gắng tải dữ liệu hàng loạt vào Oracle. Sau khi thử kết hợp các tùy chọn khác nhau, tôi đã rất ngạc nhiên khi thấy tải đường dẫn thông thường chạy nhanh hơn nhiều so với tải đường dẫn trực tiếp.Trình tải Oracle SQL * chạy trong chế độ trực tiếp chậm hơn nhiều so với tải đường dẫn thông thường

Một vài sự thật về các vấn đề:

  • Số hồ sơ để nạp là 60K.
  • Số lượng bản ghi trong bảng mục tiêu, trước khi tải, là 700 triệu.
  • Phiên bản Oracle là 11g r2.
  • Tệp dữ liệu chứa ngày, ký tự (ascii, không yêu cầu chuyển đổi), số nguyên, float. Không có blob/clob.
  • Bảng được phân đoạn bằng băm. Hàm băm giống như hàm PK.
  • Song song bảng được đặt thành 4 trong khi máy chủ có 16 CPU.
  • Chỉ mục được phân vùng cục bộ. Song song chỉ mục (từ ALL_INDEXES) là 1.
  • Chỉ có 1 chỉ mục PK và 1 trên bảng mục tiêu. Ràng buộc PK được tạo bằng chỉ mục.
  • Kiểm tra phân vùng chỉ mục cho thấy rằng phân phối bản ghi giữa các phân vùng là khá đều.
  • Tệp dữ liệu được phân tách.
  • Tùy chọn PHỤ LỤC được sử dụng.
  • Chọn và xóa dữ liệu đã tải thông qua SQL là khá nhanh, hầu như phản hồi ngay lập tức.

Với đường dẫn thông thường, tải hoàn tất sau khoảng 6 giây.

Với tải đường dẫn trực tiếp, quá trình tải mất khoảng 20 phút. Việc chạy tồi tệ nhất mất 1,5 giờ đến hoàn thành nhưng máy chủ không bận chút nào.

Nếu skip_index_maintenance được bật, tải đường dẫn trực tiếp sẽ hoàn tất sau 2-3 giây.

Tôi đã thử khá nhiều tùy chọn nhưng không có tùy chọn nào cải thiện đáng chú ý ... KHÔNG THỂ CHỈNH SỬA, CHỈ ĐỊNH, MULTITHREADING (Tôi đang chạy SQL * Loader trên máy chủ nhiều CPU). Không ai trong số họ cải thiện tình hình.

Đây là sự kiện chờ đợi tôi tiếp tục nhìn thấy trong thời gian * SQL Loader chạy trong chế độ trực tiếp:

  • sự kiện: db tập tin tuần tự đọc
  • P1/2/3: tập tin #, khối #, khối (kiểm tra từ dba_extents rằng nó là một khối index) lớp
  • Chờ: người dùng I/O

có ai có bất kỳ ý tưởng những gì đã đi sai với tải đường dẫn trực tiếp? Hoặc là có bất cứ điều gì tôi có thể kiểm tra thêm để thực sự đào nguyên nhân gốc rễ của vấn đề? Cảm ơn trước.

Trả lời

3

Tôi đoán bạn đang rơi chim này

"Khi tải một số lượng tương đối nhỏ của hàng vào một bảng chỉ mục lớn

Trong một tải đường dẫn trực tiếp, chỉ số tồn tại được sao chép khi nó được sáp nhập với các chỉ mục mới. Nếu chỉ mục hiện tại rất lớn và số lượng khóa mới là rất nhỏ, thì thời gian sao chép chỉ mục có thể bù đắp thời gian được lưu bởi tải đường dẫn trực tiếp. "

từ Khi sử dụng một tải Đường dẫn truyền trong: http://download.oracle.com/docs/cd/B14117_01/server.101/b10825/ldr_modes.htm

+0

Bạn có biết không hành vi đó chỉ xảy ra đối với SQL Loader hay nó hành xử theo cách tương tự với chèn thêm? Tôi đã làm một thử nghiệm rất nhanh và nó dường như không sao chép chỉ mục hiện tại của tôi (khoảng 92Meg) khi tôi chèn 100 hàng với gợi ý chắp thêm. –

+0

Tôi không có ý tưởng, tôi sẽ đoán nếu bạn đã cố gắng để chèn thêm 60k hàng nó sẽ thể hiện hành vi tương tự –

+0

Cảm ơn Kevin. Tôi hoàn toàn bị mất phần đó khi tôi quét qua tài liệu của SQL * Loader. Nhưng điều gì có thể là cách tốt nhất để tải một lượng lớn dữ liệu vào một bảng không trống với số lượng bản ghi tương đối lớn? – Stanley

Các vấn đề liên quan