Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách nhanh hơn để Chèn, thông qua tập lệnh, trong Oracle?

Vấn đề

Thời gian phân tích cú pháp có thể tăng theo cấp số nhân với một số loại câu lệnh nhất định, đặc biệt là INSERT ALL . Ví dụ:

--Clear any cached statements, so we can consistently reproduce the problem.
alter system flush shared_pool;
alter session set sql_trace = true;

--100 rows
INSERT ALL
    INTO FileIds(Id,FileTypeGroupId) VALUES(1, 1)
    ...
    repeat 100 times
    ...
select * from dual;

--500 rows
INSERT ALL
    INTO FileIds(Id,FileTypeGroupId) VALUES(1, 1)
    ...
    repeat 500 times
    ...
select * from dual;

alter session set sql_trace = false;

Chạy tệp theo dõi thông qua tkprof và bạn có thể thấy thời gian Phân tích cú pháp tăng đáng kể đối với một số lượng lớn hàng. Ví dụ:

100 hàng:

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.06       0.05          0          1          0           0
Execute      1      0.00       0.00          0        100        303         100
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.06       0.05          0        101        303         100

500 hàng:

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1     14.72      14.55          0          0          0           0
Execute      1      0.01       0.02          0        502       1518         500
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2     14.74      14.58          0        502       1518         500

Giải pháp

  1. Chia câu lệnh lớn của bạn thành nhiều câu lệnh nhỏ hơn. Rất khó để tìm ra kích thước tối ưu. Trên một số phiên bản của Oracle, có một số hàng kỳ diệu sẽ gây ra sự cố. Tôi thường đi khoảng 100 hàng - đủ để nhận được hầu hết các lợi ích của việc nhóm các câu lệnh, nhưng đủ thấp để tránh lỗi phân tích cú pháp. HOẶC ...
  2. Thử insert into ... select ... from dual union all ... thay vào đó. Nó thường chạy nhanh hơn nhiều, mặc dù hiệu suất phân tích cú pháp của nó cũng có thể giảm đáng kể theo kích thước.
  3. Nâng cấp Oracle. Hiệu suất phân tích cú pháp đã được cải thiện trong các phiên bản mới hơn. Tôi không thể tái tạo sự cố này trong phiên bản 12.2 nữa.

Cảnh báo

Đừng học bài học sai lầm từ điều này. Nếu bạn lo lắng về hiệu suất SQL, 99% thời gian bạn nên nhóm những thứ tương tự lại với nhau thay vì tách chúng ra. Bạn đang làm mọi thứ đúng cách, bạn vừa gặp phải một lỗi kỳ lạ. (Tôi đã tìm kiếm Bộ phận hỗ trợ Oracle của mình nhưng không thể tìm thấy lỗi chính thức cho vấn đề này.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Câu lệnh chèn nếu không tồn tại của Oracle

  2. Cách tạo bảng lồng nhau làm đối tượng cơ sở dữ liệu trong Oracle

  3. trả về tập kết quả từ hàm

  4. Oracle.ManagedDataAccess.EntityFramework - ORA-01918:người dùng 'dbo' không tồn tại

  5. Các truy vấn hữu ích hàng đầu về AWR để nâng cấp R12.2 / R12.1