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

CHÈN 10 triệu truy vấn dưới 10 phút trong Oracle?

Tôi biết những người khác đã đề cập đến điều này và bạn không muốn nghe nó nhưng hãy sử dụng SQL * Loader hoặc các bảng bên ngoài. Thời gian tải trung bình của tôi cho các bảng có cùng chiều rộng là 12,57 giây cho chỉ hơn 10m hàng. Các tiện ích này đã được thiết kế rõ ràng để tải dữ liệu vào cơ sở dữ liệu một cách nhanh chóng và khá tốt. Điều này có thể phải chịu một số hình phạt thời gian bổ sung tùy thuộc vào định dạng tệp đầu vào của bạn, nhưng có khá nhiều tùy chọn và tôi hiếm khi phải thay đổi tệp trước khi tải.

Nếu bạn không muốn làm điều này thì bạn chưa cần phải nâng cấp phần cứng của mình; bạn cần phải loại bỏ mọi trở ngại có thể để tải nó một cách nhanh chóng. Để liệt kê chúng, hãy xóa:

  1. Chỉ mục
  2. Trình kích hoạt
  3. Trình tự
  4. Phân vùng

Với tất cả những điều này, bạn bắt buộc cơ sở dữ liệu phải thực hiện nhiều công việc hơn và vì bạn đang thực hiện việc này theo giao dịch, bạn đang không sử dụng cơ sở dữ liệu hết tiềm năng của nó.

Tải dữ liệu vào một bảng riêng biệt, nói ABC_LOAD . Sau khi dữ liệu đã được tải hoàn toàn, hãy thực hiện một đơn CHÈN câu lệnh vào ABC.

insert into abc
select abc_seq.nextval, a.*
  from abc_load a

Khi bạn làm điều này (và ngay cả khi bạn không), hãy đảm bảo rằng kích thước bộ nhớ cache trình tự là chính xác; để trích dẫn:

Khi một ứng dụng truy cập một chuỗi trong bộ đệm ẩn chuỗi, các số thứ tự này sẽ được đọc nhanh chóng. Tuy nhiên, nếu ứng dụng truy cập vào một chuỗi không có trong bộ đệm, thì chuỗi đó phải được đọc từ đĩa vào bộ đệm trước khi các số thứ tự được sử dụng.

Nếu các ứng dụng của bạn sử dụng nhiều trình tự đồng thời, thì bộ nhớ cache của bạn có thể không đủ lớn để chứa tất cả các trình tự. Trong trường hợp này, quyền truy cập vào các số thứ tự thường có thể yêu cầu đọc đĩa. Để truy cập nhanh vào tất cả các chuỗi, hãy đảm bảo rằng bộ nhớ cache của bạn có các đặc quyền để lưu giữ tất cả các chuỗi được sử dụng đồng thời bởi các ứng dụng của bạn.

Điều này có nghĩa là nếu bạn có 10 luồng đồng thời ghi 500 bản ghi mỗi luồng bằng cách sử dụng trình tự này thì bạn cần kích thước bộ nhớ cache là 5.000. Tài liệu ALTER SEQUENCE nêu cách thay đổi điều này:

alter sequence abc_seq cache 5000

Nếu bạn làm theo gợi ý của tôi, tôi sẽ tăng kích thước bộ nhớ cache lên khoảng 10,5m.

Xem xét việc sử dụng gợi ý APPEND (xem thêm Cơ sở Oracle); điều này hướng dẫn Oracle sử dụng chèn đường dẫn trực tiếp, gắn dữ liệu trực tiếp vào cuối bảng thay vì tìm kiếm không gian để đặt nó. Bạn sẽ không thể sử dụng nó nếu bảng của bạn có chỉ mục nhưng bạn có thể sử dụng nó trong ABC_LOAD

insert /*+ append */ into ABC (SSM_ID, invocation_id , calc_id, ... )
select 'c','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'a','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'b','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'c','g',NULL, 'test', 123 , 'N', 'asdf' from dual

Nếu bạn sử dụng gợi ý APPEND; Tôi muốn thêm TRUNCATE ABC_LOAD sau khi bạn đã chèn vào ABC nếu không thì bảng này sẽ phát triển vô thời hạn. Điều này sẽ an toàn vì bạn sẽ sử dụng xong bảng vào lúc đó.

Bạn không đề cập đến phiên bản hoặc phiên bản hoặc Oracle mà bạn đang sử dụng. Có một số thủ thuật nhỏ bổ sung mà bạn có thể sử dụng:

  • Oracle 12c

    Phiên bản này hỗ trợ các cột nhận dạng; bạn có thể loại bỏ hoàn toàn trình tự.

    CREATE TABLE ABC(
       seq_no         NUMBER GENERATED AS IDENTITY (increment by 5000)
    
  • Oracle 11g r2

    Nếu bạn giữ cò; bạn có thể chỉ định giá trị trình tự trực tiếp.

    :new.seq_no := ABC_seq.nextval;
    
  • Oracle Enterprise Edition

    Nếu bạn đang sử dụng Oracle Enterprise, bạn có thể tăng tốc INSERT từ ABC_LOAD bằng cách sử dụng gợi ý PARALLEL:

    insert /*+ parallel */ into abc
    select abc_seq.nextval, a.*
      from abc_load a
    

    Điều này có thể gây ra sự cố riêng của nó (quá nhiều quy trình song song, v.v.), vì vậy hãy kiểm tra. Nó có thể trợ giúp cho các lần chèn hàng loạt nhỏ hơn nhưng ít có khả năng xảy ra hơn vì bạn sẽ mất thời gian tính toán chuỗi nào sẽ xử lý những gì.

tl; dr

Sử dụng các tiện ích đi kèm với cơ sở dữ liệu.

Nếu bạn không thể sử dụng chúng thì hãy loại bỏ mọi thứ có thể làm chậm quá trình chèn và thực hiện hàng loạt, vì đó là thứ mà cơ sở dữ liệu rất tốt.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm CHR () trong Oracle

  2. Bằng (=) so với LIKE cho kiểu dữ liệu ngày tháng

  3. Xuất dữ liệu sang Excel từ bảng Oracle bằng PL SQL

  4. Xử lý BLOB oracle jdbc quá phức tạp

  5. Zero Data Loss Appliance Recovery Appliance