是否可以在 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 并让它自动运行并导出保存的查询?

由于运行查询,Redshift 集群更大

Redshift 中并行查询的执行时间随着查询数量的增加而急剧增加

定期运行 Redshift 查询

是否可以在 Redshift 集群中使用不同类型的节点?

如何在 AWS Glue PySpark 中运行并行线程?