2012-01-01 23 views
5

Tôi có 471 tệp có tổng dung lượng khoảng 100GB. Các tệp này là "\ t" riêng biệt, với dữ liệu giao dịch theo định dạng sau:Oracle 11gR2 tải nhiều tệp: sqlldr hoặc bảng bên ngoài?

char(10) not null, 
char(8) not null, 
char(1) not null, 
char(4) not null, 
number not null, 
char(1) not null, 
char(1) not null, 
char(1) not null, 
number not null 

Thứ tự của các giao dịch trong tệp quan trọng và cần được bảo tồn, lý tưởng với id khóa chính. Ban đầu, tôi nạp các tệp này với sqlldr nhưng phải mất một thời gian rất dài. Gần đây tôi đã học về các bảng bên ngoài. Từ quan điểm chiến lược, phương pháp nào tốt hơn? Bảng bên ngoài hoạt động như thế nào? Cảm ơn bạn.

+1

* Làm thế nào để làm việc bảng bên ngoài * Đó là đầy đủ được ghi trong sách hướng dẫn: http://docs.oracle.com/cd/E11882_01/server.112/e22490/et_concepts.htm –

+0

tại sao sqlldr mất nhiều thời gian? Hãy thử tải trực tiếp và đảm bảo dữ liệu của bạn nằm trên cùng một mạng con cục bộ hoặc SAN (hoặc về cơ bản, không đẩy dữ liệu qua đường ống nhỏ trên mạng, như máy chủ ở NJ đang đẩy lên một db trong CA). Một số hạn chế cho tải trực tiếp, nhưng MUCH nhanh hơn. – tbone

+1

Tôi calucated sqlldr đang tải với tốc độ 85 triệu hàng mỗi giờ. Dựa trên nói chuyện với một anh chàng, điều này có vẻ hợp lý, nhưng anh ta không phải là một chuyên gia. Có một cam kết mỗi 300k hàng. Một chuỗi oracle tạo ra một khóa chính trên chèn. Thứ tự của dữ liệu là quan trọng và chìa khóa duy trì thứ tự. Các tệp nằm trên một ổ đĩa trên cùng một máy chủ với cơ sở dữ liệu. Có thể đạt được tỷ lệ tốt hơn không? –

Trả lời

3

Việc phân tích bản ghi của bảng bên ngoài và bộ nạp SQL rất giống nhau, vì vậy thông thường không có sự khác biệt lớn về hiệu suất trong cùng một định dạng bản ghi. Tuy nhiên, Bảng bên ngoài có thể phù hợp hơn trong các trường hợp sau:

  • Bạn muốn chuyển dữ liệu khi dữ liệu đang được tải vào cơ sở dữ liệu.
  • Bạn muốn tải dữ liệu và cần phải lập chỉ mục bổ sung cho bảng dàn dựng.
  • Bạn muốn sử dụng xử lý song song trong suốt mà không phải chia dữ liệu ngoài trước tiên.

Tuy nhiên, trong những tình huống sau, sử dụng SQL * Loader để thực hiện tải tốt nhất:

  • Bạn muốn tải dữ liệu từ xa.
  • Không cần phải chuyển đổi dữ liệu và dữ liệu không cần phải được tải song song.

Để cải thiện hiệu suất của SQL * Trình tải các đề xuất sau đã được thực hiện.

  • Đừng có bất kỳ chỉ số và/hoặc hạn chế (khóa chính) trên tải của bạn bảng trong quá trình tải
  • Thêm tùy chọn sau trong dòng lệnh: TRỰC TIẾP = TRUE. Điều này sẽ bỏ qua hầu hết quá trình xử lý RDBMS bằng cách sử dụng trình tải đường dẫn trực tiếp thay vì trình tải đường dẫn thông thường. Tuy nhiên, có một số trường hợp khi bạn không thể sử dụng tải trực tiếp. Bạn có thể lấy các hạn chế này từ Hướng dẫn Tiện ích Máy chủ Oracle
  • Sử dụng dữ liệu chiều rộng cố định thay vì dữ liệu được phân tách. Đối với dữ liệu được phân định, mỗi bản ghi cần phải được quét cho delimiter
  • Cố gắng tránh bộ ký tự chuyển đổi như chuyển đổi là cả thời gian và cpu thâm
  • cho con đường truyền thống, sử dụng các thông số READSIZE và BINDSIZE.
    READSIZE sẽ lấy các khối dữ liệu lớn hơn cho mỗi lần đọc hệ thống. Tham số BINDSIZE xác định kích thước của mảng bám, do đó xác định số hàng đó sẽ được nạp mỗi đợt

Nguồn: http://download.oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/sql_loader_faq.pdf

+0

song song hoạt động cả hai trường hợp. –

+0

Đây sẽ là +1 nhưng đối với "sử dụng sửa dữ liệu chiều rộng". Không ai _asks_ khách hàng của họ cho cố định với chắc chắn? – Ben

+0

@ FlorinGhita Bạn đúng, tôi không chắc tại sao Oracle lại đặt tài liệu này vào tài liệu của họ ... –

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