2009-05-28 3 views
3

Как импортировать скрипт с 3954275 строк вставки в Oracle 10g. Я могу сделать это с sqlplus user/pass @ script.sql, но это плотина медленно (еще хуже, что фиксация находится в конце этого файла 900 МБ. Я не знаю, может ли моя конфигурация Oracle справиться с этим). Есть ли лучший (более быстрый) способ импорта данных? КПП. перед импортом БД пуста.Импорт 3954275 Вставка операторов в Oracle 10g

ответ

8

Использование SQL*Loader.

Он может разбирать даже ваши команды INSERT, если у вас нет данных в другом формате.

0

Согласны с вышесказанным: использование SQL * Loader.

Однако, если это не вариант, вы можете настроить размер блоков, SQL Plus приносит, положив заявление

SET arraysize 1000; 

в начале вашего скрипта. Это всего лишь пример из моих собственных сценариев, и вам, возможно, придется подстраивать его под свои нужды с учетом задержки и т. Д. Я думаю, что по умолчанию ему нравится 15, поэтому вы получаете много накладных расходов в своем скрипте.

3

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 установлен СИЛЫ.

Надеюсь, это поможет.

С уважением, Роб.