sql >> Database >  >> RDS >> Oracle

Oracle 11g - meest efficiënte manier om meerdere rijen in te voegen

U kunt direct pad invoegen proberen om de werking te versnellen, maar voor 100 records moet het invoegen van een conventioneel pad snel genoeg zijn en het lijkt erop dat het probleem te maken heeft met het vergrendelen van de tabel tijdens het invoegen in het logboek van een groot aantal bronnen.

Om Oracle te instrueren om direct path insert te gebruiken, moet u ofwel TOEVOEGEN of APPEND_VALUES hints afhankelijk van de syntaxis van de invoeginstructie. Bijv.

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
)

Als insert-instructie afkomstig is van PL/SQL-code, kunt u bulkinsertie gebruiken met forall-instructie om de prestaties te verbeteren (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. groeperen op eerste en laatste keer

  2. Hoe exporteer ik alle gegevens van een tabel naar een invoegbaar sql-formaat?

  3. Microsoft SQL Server 2008 Management Studio - Probleem met verbinding/server/instantie

  4. Oracle Database Explorer:gratis training en accreditatie