Самый быстрый способ обновить большую таблицу из другой (большой) таблицы? - PullRequest
0 голосов
/ 29 января 2019

У меня есть две большие таблицы (~ 40M строк каждая) в Oracle.Мне нужно обновить таблицу A с данными из таблицы B на основе одного соединения.Я пробовал:

update tableA a
set (a.column2)=
(select b.column2 from tableB b
where a.column1=b.column1)

Это работает, но занимает около 1 часа.

Я также проверил следующее (объясните план):

merge into tableA a
using (select b.column1, b.column2 from tableB b) b
on (a.column1=b.column1)
when matched then
update set a.column2=b.column2

Но его стоимость, кажется, в 10 раз превышает стоимость первого запроса.Я также пытался обновить с помощью курсора, но это заняло 2 часа.

Обе таблицы имеют индекс для column1.Таблица A также имеет разделы на ежемесячной основе.

Есть идеи, как сделать этот процесс более эффективным?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Вы пробовали следующий способ?

UPDATE 
(SELECT tableA.column2 as OLD, tableB.column2 as NEW
 FROM tableA
 INNER JOIN tableB
 ON tableA.column1 = tableB.column1
) t
SET t.old = t.new
0 голосов
/ 07 февраля 2019

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

declare
c_limit number:10000;
CURSOR c_update IS
SELECT b.column1,b.column2 from tableB b,tableA a  where a.column1=b.column1
type upd_Arry is table of c_update%rowtype;
upd_val  upd_Arry;

BEGIN
    OPEN c_update;
    LOOP
    FETCH c_update BULK COLLECT INTO upd_val LIMIT c_limit;

    FORALL i IN 1..l_data.COUNT
    update tableA 
      set column2=upd_val(i).b.column2
      where column1=upd_val(i).b.column1;

    EXIT WHEN c_update%NOTFOUND;
    END LOOP;
    commit;
    CLOSE c_update;
END ;
0 голосов
/ 29 января 2019

Я бы попытался добавить предложение where к первому запросу:

update tableA a
    set a.column2 = (select b.column2 from tableB b
where a.column1 = b.column1)
    where a.column2 <> (select b.column2 from tableB b
where a.column1 = b.column1);

(предполагается, что целевое значение не NULL.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...