Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle 11g - cara paling efisien untuk menyisipkan banyak baris

Anda dapat mencoba menyisipkan jalur langsung untuk mempercepat operasi, tetapi untuk 100 catatan penyisipan jalur konvensional harus cukup cepat dan tampaknya masalahnya adalah tentang penguncian tabel saat memasukkan ke dalam log dari sejumlah besar sumber.

Untuk menginstruksikan Oracle menggunakan penyisipan jalur langsung, Anda harus menentukan TAMBAHKAN atau APPEND_VALUES petunjuk tergantung pada sintaks pernyataan insert. Mis.

insert /*+ APPEND */ 
into multi_insert(val_1, val_2)
select * from (
  select 100,    20 from dual union all
  select 21,      2 from dual union all
  select 321,    10 from dual union all
  select 22,     13 from dual union all
  select 14,    121 from dual union all
  select 11,    112 from dual union all
  select 112,    23 from dual union all
  select 132,  2323 from dual union all
  select 121,    34 from dual union all
  select 24333, 333 from dual union all
  select 1232, 3434 from dual union all
  select 4554, 3434 from dual union all
  select 3434,  211 from dual union all
  select 3434, 1233 from dual union all
  select 12,     22 from dual union all
  select 356,   233 from dual union all
  select 9347,   23 from dual union all
  select 8904,  245 from dual union all
  select 342,  4545 from dual union all
  select 453,   233 from dual
)

Jika pernyataan penyisipan berasal dari kode PL/SQL maka Anda dapat menggunakan penyisipan massal dengan pernyataan forall untuk meningkatkan kinerja (SQLFiddle ) :

declare
  type TRowList is table of multi_insert%rowtype index by binary_integer;

  vRowList TRowList;
  vRow     multi_insert%rowtype;
begin


  vRow.val_1 := 100;
  vRow.val_2 := 20;
  vRowList(0) := vRow;

  vRow.val_1 := 21;
  vRow.val_2 := 2;
  vRowList(1) := vRow;

  vRow.val_1 := 321;
  vRow.val_2 := 10;
  vRowList(2) := vRow;

  -- ...

  forall vIdx in vRowList.first .. vRowList.last
        insert /*+ APPEND_VALUES */  -- direct path insert
        into multi_insert values vRowList(vIdx);

end;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kata terakhir dalam sebuah kalimat:Dalam SQL (ekspresi reguler mungkin?)

  2. Oracle SQL:Kolom tidak diizinkan

  3. apakah mungkin untuk memiliki generator urutan alfanumerik di sql

  4. Oracle:ORA-12154:Masalah TNS:Excel 64-bit/Windows 10 64-bit

  5. Oracle SQL - Klausa IN menampilkan semua record yang diberikan dalam kondisi IN bahkan ketika data tidak ada dalam tabel