在Vertica中合并

时间:2012-05-17 07:53:01

标签: insert merge vertica

我想在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用作插入/更新的示例。

4 个答案:

答案 0 :(得分:4)

您真的不想在Vertica中进行更新。插入很好。选择很好。但我强烈建议远离任何更新或删除的内容。

系统经过优化,可以读取大量数据并插入大量数据。所以,既然你想做一个2中的1个操作,我会建议反对它。

正如您所说,您可以将语句拆分为插入和更新。

我会推荐什么,不知道你想做什么的细节,所以这可能会有所改变:

1)将外部来源的数据插入临时表 2)使用您正在考虑的标准,从该表执行和INSERT-SELECT到您想要的表中。要么使用连接,要么使用带有子查询的两个语句来测试要测试的表 3)截断临时表。

我猜想这似乎很复杂,但你真的不想做UPDATE的。如果您认为这很麻烦,请记住导致麻烦的原因是您在SELECT语句中获得的收益。

答案 1 :(得分:3)

如果您想要MERGE语句的示例,请点击此链接。这是Vertica文档的链接。请务必清楚地遵循说明。您无法编写跟随WHEN NOT MATCHEDWHEN 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不太适合单行更新,但大批量更新不是问题。我不建议重新创建整个表,我会研究围绕从临时表重新创建分区或批量更新的策略。