Pra*_*kar 2 paraccel amazon-redshift
由于在RedShift中不支持用户定义的函数或存储过程,我如何UPSERT在RedShift中实现使用ParAccel(PostgreSQL 8.0.2分支)的机制.
目前,我正在尝试使用IF实现UPSERT机制...那么... ELSE ...声明例如: -
IF NOT EXISTS(SELECT...WHERE(SELECT..))
THEN INSERT INTO tblABC() SELECT... FROM tblXYZ
ELSE UPDATE tblABC SET.,.,.,. FROM tblXYZ WHERE...
Run Code Online (Sandbox Code Playgroud)
这给了我错误.因为我正在独立编写此代码而不将其包含在函数或SP中.那么,有没有任何解决方案来实现UPSERT.
谢谢
Cra*_*ger 11
您应该阅读由depesz撰写的关于upsert的这篇文章.您不能依赖SERIALIABLE此,因为AFAIK,ParAccel不支持完全可串行化支持,如Pg 9.1+.正如该帖所述,无论如何,你无法真正完成你想要的数据.
简短的版本是,即使在支持可写CTE的当前PostgreSQL版本上,它仍然很难.在基于8.0的ParAccel上,你几乎没有运气.
我会做一个分阶段的合并.COPY新数据到服务器上的临时表,LOCK目标表,然后执行一个UPDATE ... FROM后跟INSERT INTO ... SELECT.以大块进行数据上传并锁定表以进行upserts与合理使用Redshift的方式相当合理.
另一种方法是通过应用程序集群本地的东西来外部协调upsert.让所有工具通过外部工具进行通信,在进行插入之前,他们会采用"插入意图锁定".您需要一个适合您系统的分布式锁定工具.如果所有内容都在一个应用程序服务器中运行,那么它可能就像同步的单例对象一样简单.
| 归档时间: |
|
| 查看次数: |
4545 次 |
| 最近记录: |