Вставка нескольких строк в Oracle - PullRequest
12 голосов
/ 19 мая 2009

В обсуждении о вставке нескольких строк в Oracle были продемонстрированы два подхода:

Первый:

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
          select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

Второе:

INSERT ALL
   INTO t (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO t (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO t (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
   .
   .
   .
SELECT 1 FROM DUAL;

Может ли кто-нибудь утверждать о предпочтении использования одного над другим?

P.S. Я не проводил никаких исследований сам (даже план объяснения), поэтому любая информация или мнение будут оценены.

Спасибо.

Ответы [ 7 ]

7 голосов
/ 19 мая 2009

С точки зрения производительности эти запросы идентичны.

UNION ALL не повлияет на производительность, поскольку Oracle оценивает UNION 'ed запрос только тогда, когда он ему нужен, сначала он не кэширует результаты. Синтаксис

SELECT более гибок в том смысле, что вы можете проще манипулировать запросом SELECT, если хотите что-то изменить.

Например, этот запрос:

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
          select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

можно переписать как

INSERT
INTO    pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
SELECT  7999 + level, 0, 'Multi ' || 7999 + level, 1
FROM    dual
CONNECT BY
        level <= 2

Заменив 2 на соответствующее число, вы можете получить любое количество строк.

В случае INSERT ALL вам придется продублировать описание таблицы назначения, которое будет менее читабельным, если вам понадобится, например, 40 строки.

4 голосов
/ 09 ноября 2011

Метод INSERT ALL имеет проблему с вставкой большего числа строк в таблицу.

Недавно я хотел вставить 1130 строк в таблицу с одним оператором SQL. Когда я попытался сделать это методом INSERT ALL, я получил следующую ошибку:

ORA-24335 - не может поддерживать более 1000 столбцов

Когда я использовал INSERT INTO .. UNION ALL .. подход, все прошло нормально.

Btw. Я не знал о методе UNION ALL до того, как нашел это обсуждение:)

3 голосов
/ 06 сентября 2013

Я попробовал какой-нибудь тест, и более быстрое решение должно быть

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
          select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

буферизация между 300 <-> 400 строками (я пробовал с odbc, это значение может зависеть от его конфигурации)

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

Я подозреваю, что решение 1 - это хак, который работает и, вероятно, менее эффективен, чем разработанная альтернатива Insert ALL.

Функция «Вставить все» действительно предназначена для вставки множества строк в более чем одну таблицу в результате выбора, например:

Insert ALL
into 
  t1 (c1, c2) values (q1, q2)
  t2 (x1, x2) values (q1, q3)
select q1, q2, q3 from t3 

Если вы хотите загрузить тысячи строк , а их еще нет в базе данных , я не думаю, что это лучший способ сделать это - если ваши данные находятся в файле, вы хотите посмотреть на внешние таблицы или загрузчик SQL, чтобы эффективно вставить строки для вас.

2 голосов
/ 19 мая 2009

Оператор, использующий UNION ALL, теоретически имеет небольшой недостаток в производительности, поскольку должен объединить результаты всех операторов, прежде чем произойдет вставка. У INSERT ALL нет этого недостатка, так как конечный результат уже может быть обработан построчно.

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

По моему мнению, INSERT ALL лучше воспринимается человеком, в то время как вариант UNION ALL занимает меньше места, когда такая вставка генерируется автоматически.

0 голосов
/ 14 декабря 2016

Если у вас есть операторы вставки, которые больше 1000, поместите все операторы вставки в файл .sql и откройте их в Toad или SQL Developer, а затем выполните. Все записи будут вставлены.

0 голосов
/ 01 октября 2014

Вы должны рассмотреть Array-Insert.

  • Простой SQL
  • требуется некоторое кодирование на стороне клиента для настройки параметров массива

Это способ минимизировать сетевой трафик, если необходимо выполнить несколько сотен вставок в пакете.

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