Импорт 3954275 операторов вставки в Oracle 10g - PullRequest
3 голосов
/ 28 мая 2009

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

Ответы [ 3 ]

8 голосов
/ 28 мая 2009

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

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

3 голосов
/ 29 мая 2009

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.

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

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

0 голосов
/ 28 мая 2009

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

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

SET arraysize 1000;

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

...