SQL * Loader является хорошей альтернативой, если ваш файл размером 900 МБ содержит операторы вставки в той же таблице. Будет громоздко, если в нем будет много таблиц. Однако это самый быстрый вариант.
Если по какой-то причине небольшое улучшение достаточно, то убедитесь, что для параметра сеанса CURSOR SHARING установлено значение FORCE или SIMILAR. Каждый оператор вставки в вашем файле, вероятно, будет таким же, за исключением значений. Если для CURSOR_SHARING установлено значение EXACT, то каждый из операторов вставки должен быть подвергнут жесткому анализу, поскольку он уникален. FORCE и SIMILAR автоматически превращают ваши литералы в предложение VALUES для связывания переменных, избавляя от необходимости повторного анализа снова и снова.
Вы можете использовать скрипт ниже, чтобы проверить это:
set echo on
alter system flush shared_pool
/
create table t
( id int
, name varchar2(30)
)
/
set echo off
set feedback off
set heading off
set termout off
spool sof11.txt
prompt begin
select 'insert into t (id,name) values (' || to_char(level) || ', ''name' || to_char(level) || ''');'
from dual
connect by level <= 10000
/
prompt end;;
prompt /
spool off
set termout on
set heading on
set feedback on
set timing on
@sof11.txt
set timing off
alter session set cursor_sharing = force
/
set timing on
@sof11.txt
set timing off
alter session set cursor_sharing = exact
/
set echo off
drop table t purge
/
В примере выполняются 10 000 операторов, таких как «вставить в значения t (id, name) (1, 'name1');
". Вывод на мой ноутбук:
SQL> alter system flush shared_pool
2 /
Systeem is gewijzigd.
SQL> create table t
2 ( id int
3 , name varchar2(30)
4 )
5 /
Tabel is aangemaakt.
SQL> set echo off
PL/SQL-procedure is geslaagd.
Verstreken: 00:00:17.10
Sessie is gewijzigd.
PL/SQL-procedure is geslaagd.
Verstreken: 00:00:05.50
Более чем в 3 раза быстрее, если для параметра CURSOR_SHARING установлено значение FORCE.
Надеюсь, это поможет.
С уважением,
Роб.