amazon-redshift - 在没有函数或存储过程的情况下在 Amazon RedShift 中更新插入

标签 amazon-redshift paraccel

由于 RedShift 不支持用户定义的函数或存储过程,我如何在使用 ParAccel(PostgreSQL 8.0.2 分支)的 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。

谢谢

最佳答案

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

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

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

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

关于amazon-redshift - 在没有函数或存储过程的情况下在 Amazon RedShift 中更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187251/

相关文章:

amazon-web-services - 如何在 RedShift/ParAccel 中测量磁盘上的表空间

postgresql - 在 Redshift 中合并具有非空值的多行

python - 使用 python 和 psycopg2 将数据从 S3 复制到 AWS redshift

sql - 在postgres中如何从事件日志类型表(具有时间戳)中获取特定时间范围内字段的总和(或汇总)

memory - Redshift查询CPU时间

amazon-web-services - 尽管所有打开的安全组都无法从本地计算机中的 SQL 工作台访问 AWS redshift (EC2-classic)

amazon-web-services - 亚马逊 Redshift 中的并发查询性能