Загрузка данных в Oracle - PullRequest
2 голосов
/ 21 мая 2009

У меня проблема с загрузкой данных. Мне нужно скопировать 800 000 строк из одной таблицы в другую в базе данных Oracle.

Сначала я пробовал 10000 строк, но это заняло мало времени. Я попытался использовать предложения «BULK COLLECT» и «INSERT INTO SELECT», но в обоих случаях время ответа составляет около 35 минут. Это не тот желаемый ответ, который я ищу.

У кого-нибудь есть предложения?

Ответы [ 6 ]

5 голосов
/ 21 мая 2009

Anirban,

Использование «INSERT INTO SELECT» - это самый быстрый способ заполнить вашу таблицу. Вы можете расширить его одним или двумя из следующих подсказок:

  • APPEND: использовать прямую загрузку пути, обходя буферный кеш
  • PARALLEL: использовать параллельную обработку, если ваша система имеет несколько процессоров, и это одноразовая операция или операция, которая выполняется в то время, когда не имеет значения, что один «эгоистичный» процесс потребляет больше ресурсов. *

Просто с помощью подсказки на моем ноутбуке копирует 800 000 очень маленьких строк за 5 секунд:

SQL> create table one_table (id,name)
  2  as
  3   select level, 'name' || to_char(level)
  4     from dual
  5  connect by level <= 800000
  6  /

Tabel is aangemaakt.

SQL> create table another_table as select * from one_table where 1=0
  2  /

Tabel is aangemaakt.

SQL> select count(*) from another_table
  2  /

  COUNT(*)
----------
         0

1 rij is geselecteerd.

SQL> set timing on
SQL> insert /*+ append */ into another_table select * from one_table
  2  /

800000 rijen zijn aangemaakt.

Verstreken: 00:00:04.76

Вы упоминаете, что в вашем случае эта операция занимает 35 минут. Можете ли вы опубликовать более подробную информацию, чтобы мы могли увидеть, что именно занимает 35 минут?

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

1 голос
/ 21 мая 2009

INSERT INTO SELECT - самый быстрый способ сделать это.

Если возможно / необходимо, сначала отключите все индексы в целевой таблице.

Если у вас нет данных в целевой таблице, вы также можете попробовать CREATE AS SELECT.

1 голос
/ 21 мая 2009

Я бы согласился с Робом. Вставить в () выберите это самый быстрый способ сделать это.

Что именно вам нужно сделать? Если вы пытаетесь сделать переименование таблицы, скопировав в новую таблицу и затем удалив старую, возможно, лучше переименовать таблицу:

alter table
   table
rename to
   someothertable;
0 голосов
/ 27 мая 2009

попробуйте удалить все индексы / ограничения в вашей целевой таблице, а затем заново создать их после загрузки данных.

используйте подсказку /*+NOLOGGING*/ в случае, если вы используете режим NOARCHIVELOG, или рассмотрите возможность резервного копирования сразу после операции.

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

Таблица, которую вы копируете, имеет ту же структуру, что и другая таблица? У него есть данные или вы создаете новый? Вы можете использовать exp / imp? Exp может дать запрос на ограничение того, что он экспортирует, а затем импортирует в БД. Каков общий размер таблицы, из которой вы копируете? Если вы копируете большую часть данных из одной таблицы во вторую, вы можете вместо этого скопировать полную таблицу, используя exp / imp, а затем удалить ненужные строки, которые будут меньше, чем при копировании.

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

Как и выше, я бы рекомендовал Insert INTO ... AS select .... или CREATE TABLE ... AS SELECT ... как самый быстрый способ скопировать большой объем данных между двумя таблицами.

Вы хотите найти вставку с прямой загрузкой в ​​документации к оракулу. Это добавляет два элемента к вашим утверждениям: параллельное и nologging. Повторите тесты, но сделайте следующее:

CREATE TABLE Table2 AS SELECT * FROM Table1 where 1=2;
ALTER TABLE Table2 NOLOGGING;
ALTER TABLE TABLE2 PARALLEL (10);
ALTER TABLE TABLE1 PARALLEL (10);
ALTER SESSION ENABLE PARALLEL DML;
INSERT INTO TABLE2 SELECT * FROM Table 1;
COMMIT;
ALTER TABLE 2 LOGGING:

Отключает ведение журнала отката для вставок в таблицу. Если происходит сбой системы, восстановление не выполняется, и вы не можете выполнить откат транзакции. PARALLEL использует N рабочих потоков для копирования данных в блоки. Вам придется поэкспериментировать с количеством параллельных рабочих потоков, чтобы получить наилучшие результаты в вашей системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...