Realizar uma operação de mesclagem especificando uma lista de colunas sem usar o comando MERGE - Amazon Redshift

Realizar uma operação de mesclagem especificando uma lista de colunas sem usar o comando MERGE

Ao executar a operação de mesclagem detalhada no procedimento, coloque todas as etapas em uma única transação. A transação será revertida se ocorrer uma falha na etapa. O uso de uma única transação também reduz o número de confirmações, que economiza tempo e recursos.

Para executar uma operação de mesclagem através da especificação de uma lista de colunas
  1. Coloque toda a operação em um único bloco de transações.

    BEGIN transaction; … END transaction;
  2. Crie uma tabela de preparação e preencha-a com os dados a serem mesclados, conforme exibido no seguinte pseudocódigo.

    create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';
  3. Atualize a tabela de destino usando um junção interna com a tabela de preparação.

    • Na cláusula UPDATE, liste explicitamente as colunas a serem atualizadas.

    • Execute uma junção interna com a tabela de preparação.

    • Se a chave de distribuição for diferente da chave primária e a chave de distribuição não estiver sendo atualizada, adicione uma junção redundante à chave de distribuição. Para verificar se consulta usará uma junção colocada, execute a consulta com EXPLAIN e verifique DS_DIST_NONE em todas as junções. Para obter mais informações, consulte Avaliação do plano de consulta

    • Se sua tabela de destino for classificada por timestamp, adicione um predicado para tirar proveito das varreduras de intervalo restrito na tabela de destino. Para ter mais informações, consulte Práticas recomendadas do Amazon Redshift para criar consultas.

    • Se você não pretende usar todas as linhas na mesclagem, adicione uma cláusula para filtrar as linhas que precisam ser alteradas. Por exemplo, adicione um filtro de desigualdade em uma ou mais colunas para excluir as linhas que não alteraram.

    • Coloque as operações de atualização, exclusão e inserção em um único bloco de transações de forma que, se houver um problema, tudo seja revertido.

    Por exemplo:

    begin transaction; update target set col1 = stage.col1, col2 = stage.col2, col3 = 'expression' from stage where target.primarykey = stage.primarykey and target.distkey = stage.distkey and target.col3 > 'last_update_time' and (target.col1 != stage.col1 or target.col2 != stage.col2 or target.col3 = 'filter_expression');
  4. Exclua linhas indesejadas da tabela de preparação usando um junção interna com a tabela de destino. Algumas linhas na tabela de destino já correspondem a linhas na tabela de preparação e outras foram atualizadas na etapa anterior. Em ambos os casos, elas não são necessárias para a inserção.

    delete from stage using target where stage.primarykey = target.primarykey;
  5. Insira as linhas remanescentes da tabela de preparação. Use a mesma lista de coluna na cláusula VALUES que você usou na instrução UPDATE da etapa dois.

    insert into target (select col1, col2, 'expression' from stage); end transaction;
  6. Descarte a tabela de preparação.

    drop table stage;