Pivotal Greenplum - 增量数据问题

Posted

技术标签:

【中文标题】Pivotal Greenplum - 增量数据问题【英文标题】:Pivotal Greenplum - Incremental Data issue 【发布时间】:2017-02-26 14:08:22 【问题描述】:

当我尝试在一个 SQL 事务中捕获增量负载时。更新不起作用。基本上,它会无限期地执行 90k 行。

输入 SQL 事务

BEGIN;
INSERT INTO IncrementalLoad_Dest.dbo.tblDest
(ColID, ColA, ColB, ColC)
SELECT s.ColID, s.ColA, s.ColB, s.ColC 
FROM IncrementalLoad_Source.dbo.tblSource s
LEFT JOIN IncrementalLoad_Dest.dbo.tblDest d ON d.ColID = s.ColID
WHERE d.ColID IS NULL ;
UPDATE d
SET
d.ColA = s.ColA
,d.ColB = s.ColB
,d.ColC = s.ColC
FROM IncrementalLoad_Dest.dbo.tblDest d
INNER JOIN IncrementalLoad_Source.dbo.tblSource s ON s.ColID = d.ColID
WHERE (
(d.ColA != s.ColA)
OR (d.ColB != s.ColB) 
OR (d.ColC != s.ColC)
);
END;

更新语句未从 psql 实用程序执行。为什么它继续执行甚至没有抛出错误。

另外,尝试检查目标文件上的活动锁定。不存在锁。

请考虑用双引号括住每列的列以及用 greenplum SQL 语法编写的 SQL 事务。

对此的任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

试试这个:

UPDATE IncrementalLoad_Dest_dbo.tblDest d
SET d.ColA = s.ColA,
    d.ColB = s.ColB,
    d.ColC = s.ColC
FROM IncrementalLoad_Source_dbo.tblSource s 
WHERE s.ColID = d.ColID
and ((d.ColA != s.ColA) OR (d.ColB != s.ColB) OR (d.ColC != s.ColC));

您基本上必须更改您的 SQL Server 语法以更符合 ANSI 标准,这样它才能在 Greenplum 中工作。

此外,您可能希望避免使用 UPDATE 语句。在执行 UPDATE 之前,您肯定需要 VACUUM。您可能希望在创建表时对表进行附加优化 (appendonly=true)。

【讨论】:

未来是否有可能在 greenplum 数据库中执行 UPSERT 操作? 我按照上面提到的方法做了。情况相同,它继续执行。我们可以在聊天中讨论吗? 还有,刚刚取消更新语句后检查发现文件中有锁。:paste.ofcode.org/g36qTr32RvxRUsSgAyAdeT “未执行”和“未完成”是两个不同的东西。您应该确保两个表都由相同的键分布。确保您已经分析并清理了表格。如果您已经删除或更新了数据,您可能有一个非常臃肿的表,这只会增加运行所需的时间。您可能需要重建表。 在这种情况下“未完成。源表是外部表。因此,它没有使用分布式子句,而目标表是常规表。真空和分析已经在其上运行。我也重建了常规表。

以上是关于Pivotal Greenplum - 增量数据问题的主要内容,如果未能解决你的问题,请参考以下文章

错误:[Pivotal][Greenplum JDBC Driver][Greenplum]prepared statement "PS1" 已经存在

如何安装greenplum

Pivotal greenplum - talend 的 gpload 问题

无法使用 Spark 连接器从 GreenPlum 读取

实现从Oracle增量同步数据到GreenPlum

Bireme:一个 Greenplum数据仓库的增量同步工具