通过在不使用 MERGE 的情况下指定列列表执行合并操作
当您运行此过程中详述的合并操作时,请将所有步骤放在单个事务中。如果任何步骤失败,事务将回滚。使用单个事务还将减少提交次数,从而节省时间和资源。
通过指定列列表执行合并操作
-
将整个操作放在单个事务块中。
BEGIN transaction; … END transaction;
-
创建暂存表,然后使用要合并的数据填充它,如下面的伪代码所示。
create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';
-
使用与暂存表的内部联接更新目标表。
-
在 UPDATE 子句中,显式列出要更新的列。
-
执行与暂存表的内部联接。
-
如果分配键与主键不同且分配键将不会更新,请在分配键上添加一个冗余联接。要验证查询是否将使用并置联接,请使用 EXPLAIN 运行查询并检查所有联接上是否有 DS_DIST_NONE。有关更多信息,请参阅评估查询计划。
-
如果目标表按时间戳排序,请添加谓词以对目标表使用限定范围的扫描。有关更多信息,请参阅 设计查询的 Amazon Redshift 最佳实践。
-
如果您将不在合并中使用所有行,请添加一个子句以筛选要更改的行。例如,添加针对一个或多个列的不等于筛选器以排除未更改的行。
-
将更新、删除和插入操作放在单个事务块中,以便在出现问题时回滚所有内容。
例如:
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');
-
-
使用与目标表的内部联接从暂存表中删除不需要的行。目标表中的一部分行已经与暂存表中的对应行匹配,而另一些行已在上一个步骤中更新。在任一情况下,都不需要插入它们。
delete from stage using target where stage.primarykey = target.primarykey;
-
插入暂存表中的剩余行。在 VALUES 子句中使用您在步骤 2 的 UPDATE 语句中使用的同一列列表。
insert into target (select col1, col2, 'expression' from stage); end transaction;
-
删除暂存表。
drop table stage;