2008-09-27 36 views
7

Tôi đang viết một chuyển đổi dữ liệu trong PL/SQL xử lý dữ liệu và tải nó vào một bảng. Theo PL/SQL Profiler, một trong những phần chậm nhất của chuyển đổi là chèn thực tế vào bảng đích. Bảng có một chỉ mục duy nhất.Cách nhanh nhất để chèn dữ liệu vào bảng Oracle là gì?

Để chuẩn bị dữ liệu cho tải, tôi cư một biến bằng cách sử dụng ROWTYPE của bảng, sau đó chèn nó vào bảng như thế này:

insert into mytable values r_myRow;

Dường như tôi có thể đạt được hiệu suất bằng cách thực hiện như sau:

  • Tắt đăng xuất trong quá trình chèn
  • Chèn nhiều bản ghi cùng một lúc

Các phương pháp này có được khuyến khích không? Nếu vậy, cú pháp là gì?

Trả lời

14

Đó là tốt hơn nhiều khi chèn một vài trăm hàng tại một thời điểm, sử dụng các bảng PL/SQL và FORALL để liên kết vào câu lệnh chèn. Để biết chi tiết về điều này, hãy xem here.

Cũng nên cẩn thận với cách bạn xây dựng các bảng PL/SQL. Nếu có thể, thay vì làm tất cả các biến đổi của bạn trực tiếp trong SQL bằng cách sử dụng "INSERT INTO t1 SELECT ..." khi thực hiện các hoạt động theo hàng trong PL/SQL sẽ vẫn chậm hơn SQL.

Trong cả hai trường hợp, bạn cũng có thể sử dụng chèn đường dẫn trực tiếp bằng cách sử dụng INSERT /*+APPEND*/, về cơ bản sẽ bỏ qua bộ đệm DB và trực tiếp phân bổ và ghi khối mới vào tệp dữ liệu. Điều này cũng có thể làm giảm số lượng đăng nhập, tùy thuộc vào cách bạn sử dụng nó. Điều này cũng có một số ý nghĩa, vì vậy hãy đọc số fine manual trước tiên.

Cuối cùng, nếu bạn cắt xén và xây dựng lại bảng, nó có thể đáng giá để thả đầu tiên (hoặc đánh dấu không sử dụng được) và sau đó xây dựng lại các chỉ mục.

0

Thả chỉ mục, sau đó chèn hàng, sau đó tạo lại chỉ mục.

+0

Sử dụng một insetr số lượng lớn phương pháp luận sẽ giảm thiểu tác động của việc có chỉ mục trên đó. –

0

Kiểm tra liên kết này http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

  1. điểm chính để xem xét cho trường hợp bạn là sử dụng Nối gợi ý như này sẽ trực tiếp nối thêm vào bảng thay vì sử dụng freelist. Nếu bạn có thể đủ khả năng để tắt logging hơn sử dụng thêm với nologging gợi ý để làm điều đó
  2. Sử dụng một số lượng lớn chèn thay vì thay vì lặp trong PL/SQL
  3. Sử dụng sqlloaded để tải dữ liệu trực tiếp vào bảng nếu bạn đang nhận được dữ liệu từ nguồn cấp dữ liệu tệp
2

Báo cáo chèn thông thường là cách chậm nhất để lấy dữ liệu trong bảng và không có nghĩa là chèn hàng loạt. Bài viết sau đây tham chiếu rất nhiều kỹ thuật khác nhau để cải thiện hiệu suất: http://www.dba-oracle.com/oracle_tips_data_load.htm

+0

Liên kết đó đầy những lời khuyên khủng khiếp. –

0

Có thể một trong những lựa chọn tốt nhất của bạn là tránh Oracle càng nhiều càng tốt. Tôi đã bị bối rối bởi chính bản thân mình, nhưng thường thì một quá trình Java có thể hoạt động tốt hơn nhiều tiện ích của Oracle hoặc sử dụng OCI (đọc: SQL Plus) hoặc sẽ mất rất nhiều thời gian của bạn để có được quyền (đọc: SQL * Loader).

Điều này không ngăn bạn sử dụng các gợi ý cụ thể (hoặc/PHỤ LỤC /).

Tôi đã rất ngạc nhiên mỗi lần tôi chuyển sang loại giải pháp đó.

Chúc mừng,

Rollo

1

Giả sử bạn đã thực hiện eid, ename, sal, công việc. Vì vậy, tạo ra một bảng đầu tiên như:

SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10)); 

Bây giờ chèn dữ liệu: -

SQL>insert into tablename values(&eid,'&ename',&sal,'&job'); 
0

Dưới đây là khuyến nghị của tôi trên chèn nhanh.

Trình kích hoạt - Tắt mọi trình kích hoạt được liên kết với bảng. Bật sau khi Phụ trang hoàn tất.

Chỉ mục - Thả chỉ mục và tạo lại sau khi Phụ trang của bạn hoàn tất.

Số liệu thống kê cũ - Phân tích lại chỉ số bảng và chỉ mục.

Xóa phân đoạn chỉ mục - Xây dựng lại chỉ mục nếu cần Sử dụng Không ghi nhật ký -Insert bằng cách sử dụng INSERT APPEND (chỉ dành cho Oracle). Cách tiếp cận này là cách tiếp cận rất nguy hiểm, không tạo lại nhật ký được tạo ra do đó bạn không thể thực hiện khôi phục - tạo bản sao lưu bảng trước khi bắt đầu và không thử trên các bảng trực tiếp. Kiểm tra xem db của bạn có tùy chọn tương tự

Chèn song song: Chạy chèn song song sẽ nhận công việc nhanh hơn.

Sử dụng Bulk Insert ràng buộc - Không có nhiều chi phí trong quá trình chèn nhưng vẫn là một ý tưởng tốt để kiểm tra, nếu nó vẫn còn chậm sau ngay cả sau khi bước 1

Bạn có thể tìm hiểu thêm về http://www.dbarepublic.com/2014/04/slow-insert.html

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