我想在Vertica数据库中写一个MERGE
语句。
我知道它不能直接使用,插入/更新必须是
结合起来以达到预期的效果。
合并句子如下:
MERGE INTO table c USING (select b.field1,field2 aeg from table a, table b
where a.field3='Y'
and a.field4=b.field4
group by b.field1) t
on (c.field1=t.field1)
WHEN MATCHED THEN
UPDATE
set c.UUS_NAIT=t.field2;
只想看到MERGE用作插入/更新的示例。
答案 0 :(得分:4)
您真的不想在Vertica中进行更新。插入很好。选择很好。但我强烈建议远离任何更新或删除的内容。
系统经过优化,可以读取大量数据并插入大量数据。所以,既然你想做一个2中的1个操作,我会建议反对它。
正如您所说,您可以将语句拆分为插入和更新。
我会推荐什么,不知道你想做什么的细节,所以这可能会有所改变:
1)将外部来源的数据插入临时表 2)使用您正在考虑的标准,从该表执行和INSERT-SELECT到您想要的表中。要么使用连接,要么使用带有子查询的两个语句来测试要测试的表 3)截断临时表。
我猜想这似乎很复杂,但你真的不想做UPDATE的。如果您认为这很麻烦,请记住导致麻烦的原因是您在SELECT语句中获得的收益。
答案 1 :(得分:3)
如果您想要MERGE语句的示例,请点击此链接。这是Vertica文档的链接。请务必清楚地遵循说明。您无法编写跟随WHEN NOT MATCHED
和WHEN MATCHED
的合并。它必须遵循文档中使用说明中给出的顺序(反之亦然)。但你可以选择完全省略一个。
我不确定,如果您知道在Vertica中,更新或删除的数据并未真正从表中删除,而只是标记为“已删除”。可以通过运行以下方式手动删除此类数据: SELECT PURGE_TABLE('schemaName.tableName');
您可能需要超级用户权限才能在该架构上执行此操作。 有关这方面的更多信息,请参阅此处:Vertica Documentation; Purge Data。 Vertica网站上的一个例子:Update and Insert Simultaneously using MERGE
我同意Vertica 6.0版支持Merge。但是,如果将Vertica的AHM或纪元管理设置设置为保存大量历史记录(已删除)数据,则会降低您的更新速度。更新速度可能会从糟糕的情况变为可怕的情况。
我通常做的是删除已删除的(旧)数据,在更新表后运行清除表。这有助于保持更新的速度。 在您肯定需要运行更新的地方,合并非常有用。特别是增量每日更新,可能会更新数百万行。
获得答案:我认为Vertica不支持Merge中的Subquery。你会得到以下结果。
ERROR 0: Subquery in MERGE is not supported
当我有类似的用例时,我使用子查询创建了一个视图,并使用新创建的视图作为源表合并到目标表中。这应该让你继续在Vertica中使用MERGE操作,常规PURGE可以让你快速保持更新。
实际上,如果在ON子句中使用正确的字段组合,合并还有助于避免在插入或更新期间出现重复条目,理想情况下,这些字段应该是主键上的连接。
答案 2 :(得分:2)
我一般都喜欢杰夫的回答。这似乎违反直觉,但是你会有更好的结果创建一个包含你想要的行的新表,而不是修改现有的行。
也就是说,只有当表格超过一定规模或超过一定数量的UPDATE时,这样做才有价值。如果你正在谈论一个< 1mil行的表,我可能会对它进行更新,然后清除以消除逻辑删除的行。
答案 3 :(得分:0)
要明确的是,Vertica不太适合单行更新,但大批量更新不是问题。我不建议重新创建整个表,我会研究围绕从临时表重新创建分区或批量更新的策略。