Как улучшить время выполнения вставки в таблицу от выбора строк из таблицы миллионов строк в ORACLE? - PullRequest
0 голосов
/ 08 января 2020

Пустая таблица T1, в которую необходимо вставить строки, выбрав строки из другой таблицы T2 в ORACLE.

Как, например,

INSERT INTO T1
SELECT * FROM T2; 

Проблема в том, что таблица T2 имеет около 10 миллион строк Эта простая инструкция SELECT, кажется, выполняется в течение 25-30 секунд по отдельности. Но когда он вставляется в T1, для его завершения требуется 20-30 минут.

Почему выполнение вышеуказанного оператора занимает много времени и каков наилучший подход или как улучшить вставку данных в таблицу T1, выбирая из таблицы Т2?

Ответы [ 2 ]

2 голосов
/ 08 января 2020

С одной стороны, «кажущееся» время выполнения простого запроса SELECT немного вводит в заблуждение: ядро ​​базы данных выясняет, как выполнить запрос, а затем возвращает вам только первую «порцию» информации. (По мере того, как вы перемещаетесь по набору данных, дополнительные «порции» прозрачно предоставляются по мере необходимости.) Но когда вы указываете INSERT, сейчас , у базы данных нет другого выбора, кроме как на самом деле go через все эти миллионы строк.

Часто существуют специализированные инструменты, специально предназначенные для «массовых» операций с данными, такие как эта. Это может быть значительно быстрее.

Другая стандартная практика - временно отключить индексы. Это позволяет избежать затрат на обновление индексов для каждой записи: индекс будет полностью перестроен, когда вы снова включите его. (Вышеупомянутые инструменты «массовых операций» обычно делают подобные вещи автоматически).

2 голосов
/ 08 января 2020

Добавление подсказки APPEND может включить прямую вставку пути, что позволит избежать создания дополнительных данных REDO, используемых для восстановления:

INSERT /*+ append */ INTO T1
SELECT * FROM T2;

Добавление параллелизма может еще больше повысить производительность:

ALTER SESSION ENABLE PARALLEL DML;

INSERT /*+ parallel append */ INTO T1
SELECT * FROM T2;

Эти две функции могут сократить время выполнения с минут до секунд, но есть много предостережений, которые вам необходимо понять. Записи прямого пути блокируют таблицу и не подлежат восстановлению; если данные важны, возможно, вы не захотите ждать следующей полной резервной копии. Параллельные запросы работают сложнее , а не умнее и могут похищать ресурсы из более важных заданий. Найти оптимальную степень параллелизма довольно сложно, и вставки с прямым путем имеют много ограничений, таких как триггеры и некоторые виды ограничений ссылочной целостности.

При правильном оборудовании, конфигурации системы и коде вы можете реально повысить производительность в 100 раз. Но если вы новичок в этих функциях, будьте готовы часами изучать их.

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