Массовое слияние записей Oracle Pro*C на языке C с использованием массивов хостов, снижающих производительность при увеличении объема.

Используя Oracle 11g Pro * C в C, я использую массивы хостов для управления массовым слиянием в таблицу БД, как показано в следующем примере:

merge into TBL_NM A 
using (select 1 from dual) B 
on (col1 = to_date(:v,'YYMMDD') and col2 = :v and col3 = :v and col4 = :v) 
when matched then 
update set col5 = :v, col2 = col2+ :v, col3 = col3 + :v 
when not matched then  
insert (col1, col2, col3, col4, col5, col6, col7, col8) 
values (to_date(:v,'YYMMDD'),:v,:v,:v,:v,:v,:v,:v)

Мой первый вопрос: лучше ли этот способ массового слияния, чем сначала выполнить запрос, чтобы получить идентификатор строки, а затем, если он не найден, вставить и обновить в противном случае. Я нашел здесь обсуждения: Oracle Merge vs Select then Insert or Update и понял, что слияние лучше, чем запрос, а затем вставка или обновление.

Мой второй вопрос заключается в том, что я наблюдаю ухудшение производительности при увеличении громкости. Слияние с большими объемами занимает больше времени по сравнению с БД с меньшим объемом данных. Можно ли это настроить, чтобы повысить производительность, а не снижать производительность при увеличении громкости?

Каковы возможности улучшения в рамках Pro*C?

Из http://www.dba-oracle.com/t_append_upsert_merge_sql.htm это Кажется, лучше использовать подсказку APPEND с SQL MERGE (upsert)? Пожалуйста, поделитесь своим мнением.


person Dr. Debasish Jana    schedule 10.02.2017    source источник
comment
На самом деле это не массовое слияние, это похоже на одиночное слияние (я полагаю, выполняется в цикле). Массовое слияние будет включать слияние таблицы (или, по крайней мере, массива pl/sql). Если у вас большой объем данных, может быть быстрее загрузить временную таблицу, а затем выполнить слияние с временной.   -  person tbone    schedule 10.02.2017
comment
@tbone, это действительно массовое слияние с использованием массивов хостов, а не запуск в цикле, а выполнение оператора через PRO * C с использованием массивов хостов в соответствии с docs.oracle.com/cd/B10501_01/appdev.920/a97269/pc_08arr.htm   -  person Dr. Debasish Jana    schedule 11.02.2017
comment
Con вы предоставляете некоторые показатели. 1. Сколько времени это займет? 2. Сколько строк в таблице? 3 Сколько строк обновляется? 4. Сколько строк вставлено? 5. Каков размер вашего хост-массива. 6. Можете ли вы поделиться отчетом SQL Monitor.   -  person BobC    schedule 11.02.2017
comment
@BobC У меня нет отчета SQL Monitor, но с увеличением объема производительность, похоже, ухудшается, мой вопрос: может ли данный запрос MERGE снизить производительность с увеличением объема?   -  person Dr. Debasish Jana    schedule 14.02.2017
comment
Можете ли вы ответить на 5 других вопросов, которые я задал?   -  person BobC    schedule 14.02.2017
comment
Если вы можете получить отчет монитора, пожалуйста, получите хотя бы план выполнения.   -  person BobC    schedule 14.02.2017
comment
@BobC Приблизительно 18 миллионов данных проходят через upsert/merge (около 30% обновления и 70% вставки), это занимает около 12 часов, и ситуация ухудшается при дальнейших попытках слияния. Размер массива хоста составляет 40 КБ за раз, для получения большего количества данных мы выполняем MERGE несколько раз каждый раз, при этом через массивы хостов передается не более 40 КБ данных.   -  person Dr. Debasish Jana    schedule 14.02.2017
comment
Вы думали об индексе для col1, col2, col3?   -  person Robert Jacobs    schedule 17.02.2017