2015-02-25 2 views
0

Я пытался найти некоторые сведения о производительности инструкции Oracle MERGE по сравнению с традиционным Select Insert/Update, но не смог найти что-то с моей ситуацией.MERGE на столе Oracle с высоким коэффициентом обновления обновлений

Я использую MERGE заявление в своем коде как оператор UPSERT, пример ниже:

MERGE INTO table_a a USING dual d ON (a.keyone='a' AND a.keytwo='b') 
    WHEN MATCHED THEN UPDATE SET a_column='c' 
    WHEN NOT MATCHED THEN INSERT (keyone,keytwo,a_column) VALUES ('a','b','c') 

Это всегда будет использоваться для обновления только одна запись в таблице, которая имеет почти 70 миллионов строк. Но я сталкиваюсь с некоторыми проблемами блокировки/блокировки.

мне было интересно, если другой процесс выдачи обновления одновременно с этим «TABLE_A», пример

UPDATE table_a SET a_column='c' WHERE keyone='d' AND keytwo='e' 

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

Они бы все случающиеся примерно в то же время (одна услуги выдачи Слияния и другие выдающее обновление к TABLE_A)

я делаю неправильный подход? Должен ли я просто делать SELECT, а затем на основе результата INSERT или UPDATE для таблицы это большой? Я думал, что блокирование происходит только в том случае, если 2 оператора пытаются получить доступ к одному и тому же ресурсу строки.

EDIT: Забыл упомянуть, TABLE_A не имеет много столбцов, это по существу

key_one number 
    key_two number 
    key_three varchar(1) 
    creation_date_time, mod_date_time 

ответ

0

Я говорю поставить Объединить Если начать проблемы, замените его INSERT/UPDATE логики, если это необходимо;. но пока у вас не возникнет проблема, у вас нет проблемы. Сделайте простейшую вещь, которая могла бы работать. И я бы не сделал SELECT в первую очередь. Выполните UPDATE, проверьте SQL% ROWCOUNT (или что-то еще), а затем выполните INSERT, если это необходимо.

Делитесь и наслаждайтесь.

+0

привет Боб, спасибо, что ответ! Сегодня я использую MERGE, где я столкнулся с проблемой, когда у меня была блокировка, хотя оба процесса не имеют доступа к одной записи. Это привело только к тому, что MERGE занял некоторое время, и UPDATE был приостановлен, но я думал, что Oracle может справиться с этим без проблем. – Hellojeffy

+0

Затем попробуйте заменить MERGE UPDATE/INSERT и посмотреть, не заботится ли об этом. –

Смежные вопросы