Как импортировать скрипт с 3954275 строк вставки в Oracle 10g. Я могу сделать это с sqlplus user/pass @ script.sql
, но это плотина медленно (еще хуже, что фиксация находится в конце этого файла 900 МБ. Я не знаю, может ли моя конфигурация Oracle справиться с этим). Есть ли лучший (более быстрый) способ импорта данных? КПП. перед импортом БД пуста.Импорт 3954275 Вставка операторов в Oracle 10g
ответ
Использование SQL*Loader
.
Он может разбирать даже ваши команды INSERT
, если у вас нет данных в другом формате.
Согласны с вышесказанным: использование SQL * Loader.
Однако, если это не вариант, вы можете настроить размер блоков, SQL Plus приносит, положив заявление
SET arraysize 1000;
в начале вашего скрипта. Это всего лишь пример из моих собственных сценариев, и вам, возможно, придется подстраивать его под свои нужды с учетом задержки и т. Д. Я думаю, что по умолчанию ему нравится 15, поэтому вы получаете много накладных расходов в своем скрипте.
SQL * Loader - хорошая альтернатива, если ваш файл 900MB содержит инструкции вставки в одну и ту же таблицу. Это будет громоздко, если оно содержит множество таблиц. Это самый быстрый вариант.
Если по какой-то причине небольшое улучшение достаточно хорошее, убедитесь, что в ваших сеансах параметр CURSOR SHARING установлен в положение FORCE или SIMILAR. Каждый оператор insert в вашем файле, вероятно, будет тем же, за исключением значений. Если для 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
/
Пример выполняет 10000 заявлений, как "вставить т (номер, имя) значения (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 установлен СИЛЫ.
Надеюсь, это поможет.
С уважением, Роб.