Realización de una operación de fusión al especificar una lista de columnas sin usar el comando MERGE
Cuando ejecute la operación de fusión detallada en el procedimiento, ponga todos los pasos en una transacción única. La transacción se anula si se produce un error en algún paso. El uso de una transacción única también reduce la cantidad de confirmaciones, lo cual ahorra tiempo y recursos.
Pasos para realizar una operación de fusión al especificar una lista de columnas
-
Coloque toda la operación en un único bloque de transacción.
BEGIN transaction; … END transaction;
-
Cree una tabla provisional y, luego, complétela con los datos que se fusionarán, como se muestra en el siguiente pseudocódigo.
create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';
-
Actualice la tabla destino mediante el uso de una combinación interna con la tabla provisional.
-
En la cláusula UPDATE, especifique de manera explícita las columnas que se actualizarán.
-
Realice una combinación interna con la tabla provisional.
-
Si la clave de distribución es diferente a la clave primaria y si no se actualiza, agregue un predicado de combinación redundante en las columnas de la clave de distribución. Para corroborar que la consulta usará una combinación colocada, ejecute la consulta con EXPLAIN y, luego, controle la presencia de DS_DIST_NONE en todas las combinaciones. Para obtener más información, consulte Evaluación del plan de consulta
-
Si la tabla de destino se ordena según la marca temporal, agregue un predicado para aprovechar los análisis de rango restringido en la tabla de destino. Para obtener más información, consulte Prácticas recomendadas de Amazon Redshift para el diseño de consultas.
-
Si no usará todas las filas en la fusión, agregue una cláusula para filtrar las filas que desea cambiar. Por ejemplo, agregue un filtro de desigualdad a una o más columnas para excluir las filas que no han cambiado.
-
Ponga las operaciones de actualización, eliminación e inserción en un bloque de transacción único de manera que, si se produce un problema, todo se revierta.
Por ejemplo:
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');
-
-
Elimine las filas innecesarias de la tabla provisional mediante el uso de una combinación interna con la tabla destino. Algunas de las filas de la tabla destino ya coinciden con las filas correspondientes en la tabla provisional y otras se actualizaron en el paso anterior. En cualquiera de los casos, no se necesitan para la inserción.
delete from stage using target where stage.primarykey = target.primarykey;
-
Inserte las filas restantes desde la tabla provisional. Use la misma lista de columnas de la cláusula VALUES que usó en la instrucción UPDATE del paso dos.
insert into target (select col1, col2, 'expression' from stage); end transaction;
-
Elimine la tabla provisional.
drop table stage;