是否可以在 Redshift 中并行运行查询?
Posted
技术标签:
【中文标题】是否可以在 Redshift 中并行运行查询?【英文标题】:Is it possible to run queries in parallel in Redshift? 【发布时间】:2021-09-09 10:07:17 【问题描述】:我想在 Redshift 中同时进行插入和更新。为此,我将数据插入到临时表中,从原始表中删除更新的条目并插入所有新的和更新的条目。由于 Redshift 使用并发,有时条目会重复,因为删除是在插入完成之前开始的。为每个操作使用非常大的睡眠不会发生这种情况,但是脚本非常慢。
希望有人能帮助我,在此先感谢!
【问题讨论】:
【参考方案1】:您应该阅读 MVCC(多版本一致性控制)和事务。 Redshift 一次只能运行一个查询(对于一个会话),但这不是问题。您希望同时提交两个更改(提交是导致更改对其他人显而易见的操作)。您可以通过将 SQL 语句包装在事务中 (BEGIN ... COMMIT) 并在同一会话中执行来执行此操作(如果您使用多个会话则不清楚)。当事务所做的所有更改同时对所有人可见时,事务中所做的所有更改将仅对进行更改 UNTIL COMMIT 的会话可见。
需要注意的一些事项 - 如果您的连接处于自动提交模式,那么您可能会提前中断事务并提交部分结果。此外,当您在事务中工作时,您的源表信息是不变的(因此您在事务期间会看到一致的数据),并且不允许您更改此信息。这意味着,如果您有多个会话更改表数据,则需要注意它们提交的顺序,以便将正确版本的数据呈现给彼此。
【讨论】:
【参考方案2】:begin transaction;
<run the queries in parallel>
end transaction;
在这种特定情况下,请执行以下操作:
create temp table stage (like target);
insert into stage
select * from source
where source.filter = 'filter_expression';
begin transaction;
delete from target
using stage
where target.primarykey = stage.primarykey;
insert into target
select * from stage;
end transaction;
drop table stage;
见:
https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-upsert.html https://docs.aws.amazon.com/redshift/latest/dg/t_updating-inserting-using-staging-tables-.html【讨论】:
以上是关于是否可以在 Redshift 中并行运行查询?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将 CSV 上传到 redshift 并让它自动运行并导出保存的查询?