Вставка данных в одну таблицу из второй таблицы при условии множественного объединения - PullRequest
2 голосов
/ 26 февраля 2020

Я пытаюсь вставить данные в одну таблицу (trgt_tbl) из второй таблицы (src_tbl), используя соединение по ключевым полям. Кажется, что запрос работает нормально, но он очень медленный. В trgt_tbl имеется около 16 млн. Записей, и ожидается, что каждая ежедневная дельта-загрузка из src_tbl будет иметь около 500 тыс. Записей. Я пытаюсь выяснить, могу ли я сделать это лучше.

Примечание. Слияние не является вариантом, поскольку данные вставляются в Redshift, а Redshift не поддерживает слияние.

INSERT INTO trgt_tbl (col1,
    col2,
    col3,
    col4,
    col5,
    col6)
SELECT col1,
    col2,
    col3,
    col4,
    col5,
    col6 
FROM  src_tbl s  
WHERE NOT EXISTS (
    SELECT 1 
    FROM trgt_tbl t 
    WHERE 
        t.col1 = s.col1 
        OR t.col2 = s.col2 
        OR t.col3 = s.col3
        OR t.col4 = s.col4 
)

1 Ответ

0 голосов
/ 02 марта 2020

Как упомянуто в Руководстве для разработчиков баз данных из-за отсутствия поддержки merge / upsert, вы должны использовать комбинацию обновлений и вставок с помощью промежуточной таблицы для эффективного объединения , Например, вы можете сделать следующее:

Создать промежуточную таблицу с данными из src_tbl:

create temp table staging (like target); 
insert into staging select s.col1, s.col2, s.col3, s.col4, s.col5, s.col6 from src_tbl s JOIN trgt_tbl t ON 
    t.col1 = s.col1 
    OR t.col2 = s.col2 
    OR t.col3 = s.col3
    OR t.col4 = s.col4;

Внутреннее присоединение к промежуточной таблице для удаления строк из trgt_tbl обновите и вставьте строки из промежуточной таблицы:

begin transaction;

delete from trgt_tbl using staging where t.col1 = s.col1 OR t.col2 = stage.col2 OR t.col3 = stage.col3 OR t.col4 = stage.col4; 
insert into trgt_tbl select * from staging;

end transaction;
...