Using Oracle 11g Pro*C in C, I am using host arrays for managing bulk merge into DB table as per following example:
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)
My first Question is: whether this way of bulk merge better than running query first to get the rowid and then if not found, insert and update otherwise. I found discussions here: Oracle Merge vs Select then Insert or Update and got the idea that merge is better than query then insert or update.
My second question is that I am observing degrading performance when volume increases. It takes more time to merge with higher volumes compared to DB having lower volume of data. Can this be fine tuned to make better performance and not to degrade performance with increased volume?
What are the possibilities of improvement within Pro*C boundary?
From http://www.dba-oracle.com/t_append_upsert_merge_sql.htm, it seems using the APPEND hint with the MERGE (upsert) SQL would be better? Please share your views.