没有函数或存储过程的 Amazon RedShift 中的 Upsert

Posted

技术标签:

【中文标题】没有函数或存储过程的 Amazon RedShift 中的 Upsert【英文标题】:Upsert in Amazon RedShift without Function or Stored Procedures 【发布时间】:2013-06-19 09:07:23 【问题描述】:

由于 RedShift 中不支持用户定义的函数或存储过程,我如何在使用 ParAccel(PostgreSQL 8.0.2 fork)的 RedShift 中实现UPSERT 机制。

目前,我正在尝试使用 IF...THEN...ELSE... 语句来实现 UPSERT 机制 例如:-

IF NOT EXISTS(SELECT...WHERE(SELECT..))
              THEN INSERT INTO tblABC() SELECT... FROM tblXYZ
              ELSE UPDATE tblABC SET.,.,.,. FROM tblXYZ WHERE... 

这给了我错误。因为我正在独立编写此代码,而不将其包含在函数或 SP 中。 那么,有没有实现UPSERT的解决方案。

谢谢

【问题讨论】:

感谢您的努力。这更清楚;现在我可以告诉你想要什么了。 Redshift 文档的链接:docs.aws.amazon.com/redshift/latest/dg/… 【参考方案1】:

您可能应该阅读this article on upsert by depesz。你不能依赖SERIALIABLE 因为,AFAIK,ParAccel 不支持像 Pg 9.1+ 中的完全可序列化支持。正如那篇文章中所述,无论如何,您不能真正在数据库中做您想做的事情。

简短的版本是,即使在当前支持可写 CTE 的 PostgreSQL 版本上,它仍然很难。在基于 8.0 的 ParAccel 上,您几乎不走运。

我会进行分阶段合并。 COPY 新数据到服务器上的临时表,LOCK 目标表,然后执行 UPDATE ... FROM 后跟 INSERT INTO ... SELECT。以大块的形式上传数据并为 upserts 锁定表是合理地与 Redshift 的使用方式保持一致。

另一种方法是通过应用程序集群本地的东西从外部协调 upsert。让您的所有工具通过外部工具进行通信,在这些工具中,它们在进行插入之前会采取“插入意图锁定”。您需要一个适合您系统的分布式锁定工具。如果一切都在一个应用服务器中运行,它可能就像一个同步的单例对象一样简单。

【讨论】:

非常感谢,我已经实现了同样的功能,COPY 到 tmp 表,然后是 UPDATE,然后是 INSERT INTO...SELECT。它奏效了。

以上是关于没有函数或存储过程的 Amazon RedShift 中的 Upsert的主要内容,如果未能解决你的问题,请参考以下文章

使用 Amazon Redshift 进行维度建模是不是可行

有没有人达到过 Amazon S3 存储桶的读取或写入上限?

Amazon Redshift 存储过程调用

有没有办法在执行存储过程或函数时提前确定要返回的结果集的数量?

AMAZON 500310:无效操作:“Drop”处或附近的语法错误

存储过程或函数需要未提供的参数