Оператор множественной вставки Oracle - PullRequest
6 голосов
/ 17 мая 2011

В моем приложении мне нужно добавить много записей. Я использую следующую конструкцию:

   INSERT /*+ append parallel(t1, 4) parallel(t2, 4) */ ALL
   INTO t1 (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO t2 (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO t2 (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
   .
   .
   .
SELECT 1 FROM DUAL;

Я также использую подсказки APPEND и PARALLEL. Обратите внимание, что я вставляю данные в две разные таблицы. Кажется, что параллель игнорируется (администратор БД сказал мне). Итак, как я могу узнать, используется ли он или нет? Можно ли использовать подсказку PARALLEL в такой конструкции? Это эффективно?

Ответы [ 4 ]

4 голосов
/ 18 мая 2011

Этого, вероятно, будет достаточно, чтобы заставить его работать:

alter session enable parallel dml;

Вы можете проверить фактическую степень параллелизма с помощью запроса:

select px_servers_executions, v$sql.*
from v$sql where lower(sql_text) like '%insert%parallel%' order by last_load_time desc;

Если вы все еще не получаете параллелизм, есть много возможных причин. Для начала посмотрите на эти параметры:

select * from v$parameter where name like 'parallel%'

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

Полагаю, ваша настоящая проблема - время для анализа большого оператора SQL. Многостоловые вставки особенно плохи. Если вы попытаетесь вставить более нескольких сотен строк, ваш запрос займет много секунд для анализа. И в зависимости от вашей версии Oracle он будет зависать вечно, если вы попытаетесь использовать 501 таблицу. Гораздо быстрее выполнить несколько небольших запросов вместо одного большого запроса. Например, 5 вставок из 100 строк будут выполняться намного быстрее, чем одна вставка из 500 строк. (В общем, это полная противоположность настройке производительности для Oracle. Это особый случай из-за ошибок, связанных с анализом больших операторов SQL.)

2 голосов
/ 29 сентября 2014

Подсказка APPEND поддерживается только с синтаксисом подзапроса оператора INSERT, но не с предложением VALUES. Если вы укажете подсказку APPEND с предложением VALUES, она будет проигнорирована, и будет использоваться обычная вставка. Чтобы использовать INSERT с прямым путем с предложением VALUES, см. «Подсказка APPEND_VALUES».

1 голос
/ 18 мая 2011

Включение параллелизма для 30 записей будет пустой тратой ресурсов.Параллелизм включает в себя дорогостоящие накладные расходы (разделение работы, назначение процессов, синхронизация результатов ...), которая не будет стоить затрат на такую ​​маленькую операцию.

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


Обновление : другая идея могла бызапускать операторы с более чем одним сеансом, эффективно реализуя параллелизм DIY.Можете ли вы спроектировать процесс так, чтобы более чем один сеанс считывал входные данные и вставлял их одновременно?

1 голос
/ 18 мая 2011

В некоторых случаях параллелизм отключен. В том числе, из Документация Oracle :

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

Что мне кажется довольно большим ограничением. У вас есть триггер или внешний ключ на ваших столах?

...