Слияние, разделение и удаленная база данных - настройка производительности Oracle - PullRequest
1 голос
/ 04 мая 2020

Я хочу настроить свой запрос на слияние, который вставляет и обновляет таблицу в Oracle на основе исходной таблицы на SQL сервере. Размер таблицы составляет около 120 миллионов строк, и обычно ежедневно вставляются / обновляются около 120 тысяч записей. Выполнение слияния занимает около 1,5 часов. Он использует вложенный l oop и индекс первичного ключа для выполнения вставки и обновления. В исходной таблице нет даты обновления записи для использования; поэтому все записи сравниваются.

Merge abc tgt
using
(
   select a,b,c
   from sourcetable@sqlserver_remote) src
  on (tgt.ref_id = src.ref_id)
when matched then 
update set 
      .......
where 
    decode(tgt.a, src.a,1,0) = 0
     or ......

when not matched then 
insert (....) values (.....);
commit;

Поскольку таблица огромна и растет с каждым днем, я разделил таблицу в DEV на основе идентификатора ссылки (10 групп) и создал локальный индекс по идентификатору ссылки. Теперь он использует ha sh join и полное сканирование таблицы и работает дольше существующего процесса. Когда я перешел с локального на глобальный индекс (ref_id), я использовал вложенные циклы, но все равно выполнялся дольше, чем существующий процесс.

Есть ли способ настроить процесс на производительность.

Спасибо ...

1 Ответ

0 голосов
/ 04 мая 2020

Я бы с осторожностью присоединил / объединял огромные таблицы по ссылке на базу данных. Я бы попытался скопировать всю исходную таблицу (например, с помощью не-atomi c mview, возможно, сжатого, возможно отсортированного, конечно, только столбцов, которые вам понадобятся). После сбора статистики я бы объединил целевую таблицу с локальной копией. Впоследствии локальная копия может быть усечена.

Я не удивлюсь, если разбиение ускорит слияние локальной копии с вашей целевой таблицей.

...