Каков наиболее эффективный способ реализации операции слияния / обновления Redshift? - PullRequest
0 голосов
/ 14 июля 2020

Я сейчас пишу пользовательскую функцию upsert для конкретного c варианта использования таблицы красного смещения. В своих документах AWS предлагает два метода , на которые я черпаю вдохновение. Вот что я хочу сделать. sh:

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

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

  1. с использованием запроса EXCEPT для вставки только новых строк из временной таблицы:
    insert into persisted_table (
      select * 
      from temp_table 
      except 
      select * 
      from persisted_table
     );
сохранять результаты запроса UNION ALL во временной таблице с сохраняемой таблицей и использовать это как постоянную таблицу
    insert into new_table (
      select * 
      from temp_table 
      union
      select * 
      from persisted_table
     );
     
     alter table persisted_table rename to old_perisisted_table_marked_for_deletion;
     alter table new_table rename to persisted_table;

Я знаю, что объединение выполняется медленно и обычно не рекомендуется для массовых / крупномасштабных операций. Но есть ли какие-либо аргументы, которые могут повлиять на это решение?

1 Ответ

0 голосов
/ 14 июля 2020

Первый совет, который я бы дал, - это помнить, что Redshift - это кластер. Какой бы процесс вы ни выбрали, если данные большие, вам нужно, чтобы сравнение определило, существует ли уже строка, чтобы оставаться «на узле». Вам нужно, чтобы таблицы в вопросах распределялись по одному и тому же ключу.

Затем я бы подумал о том, какие индексы относятся к данным. Выложенные вами процессы будут сравнивать все столбцы при сравнении. Это нужно? Если подмножество столбцов может быть ключевым, это может сделать работу более эффективной.

insert into persisted_table (
  select * from temp_table a left join persisted_table b on {keys}
  where a.keys is null );

Надеюсь, эти аспекты помогут вашему процессу принятия решений

...