0

我想MERGE在 Vertica 数据库中写一个语句。我知道它不能直接使用,必须结合插入/更新才能获得预期的效果。

合并语句如下所示:

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

4 回答 4

4

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

该系统针对读取大量数据和插入大量数据进行了优化。因此,既然您想做一个执行 2 个中的 1 个的操作,我建议您不要这样做。

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

我会推荐什么,不知道你想要做什么的细节,所以这可能会发生变化:

1) 将来自外部源的数据插入临时表。
2)使用您正在考虑的标准从该表执行并插入选择到您想要的表中。使用连接或在两个带有子查询的语句中对要测试的表进行测试。
3) 截断登台表。

我猜这看起来很复杂,但你真的不想做更新。如果您认为这很麻烦,请记住导致麻烦的原因是您在 SELECT 语句上获得收益的原因。

于 2012-05-18T04:14:51.020 回答
3

如果您想要MERGE语句的示例,请点击链接。这是 Vertica 文档的链接。请记住清楚地遵循说明。您不能使用WHEN NOT MATCHED跟随的和编写合并WHEN MATCHED。它必须遵循文档中使用说明中给出的顺序(反之亦然)。但是您可以选择完全省略一个。

我不确定,如果您知道在 Vertica 中,更新或删除的数据并没有真正从表中删除,而只是标记为“已删除”。这种数据可以通过运行手动删除:SELECT PURGE_TABLE('schemaName.tableName');

您可能需要超级用户权限才能在该架构上执行此操作。可以在此处阅读有关此内容的更多信息:Vertica 文档;清除数据。Vertica 网站上的一个示例:使用 MERGE 同时更新和插入

我同意 Vertica 6.0 版支持 Merge。但如果 Vertica 的 AHM 或 epoch 管理设置被设置为保存大量历史(已删除)数据,则会减慢您的更新速度。更新速度可能会从糟糕到糟糕到可怕。

我通常会在更新表后对表执行清除操作来清除已删除(旧)数据。这有助于保持更新的速度。合并在您肯定需要运行更新的情况下很有用。尤其是增量每日更新,可能会更新数百万行。

得到您的答案:我认为 Vertica 不支持合并中的子查询。你会得到以下。

ERROR 0:  Subquery in MERGE is not supported

当我有类似的用例时,我使用子查询创建了一个视图,并使用新创建的视图作为我的源表合并到目标表中。这应该可以让您继续在 Vertica 中使用 MERGE 操作,而常规 PURGE 应该可以让您保持快速更新。

事实上,如果您在 ON 子句中使用正确的字段组合,合并也有助于避免插入或更新期间的重复条目,理想情况下,这应该是主键上的连接。

于 2013-04-09T17:50:44.410 回答
2

总的来说,我喜欢杰夫的回答。这似乎违反直觉,但与修改现有表相比,创建一个包含所需行的新表会获得更好的结果。

也就是说,只有在表超过一定大小或超过一定数量的 UPDATE 时,这样做才值得。如果您正在谈论一个 <1 百万行的表,我可能会碰巧并进行适当的更新,然后清除以摆脱墓碑行。

于 2012-05-18T06:36:22.277 回答
0

需要明确的是,Vertica 不太适合单行更新,但大批量更新的问题要小得多。我不建议重新创建整个表,我会研究有关重新创建分区或从临时表批量更新的策略。

于 2012-05-18T16:07:41.827 回答