当我尝试在一个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 实用程序执行。为什么它继续执行甚至没有抛出错误。
另外,尝试检查目标文件上的Active lock。没有锁定。
请考虑每列的双引号列和用greenplum SQL语法编写的SQL事务。
非常感谢任何帮助。
答案 0 :(得分: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)。