更新黑斑羚的 vertica 中的巨大记录



我在顶点有 50 列,黑斑羚表 B 有 20 列。表 A 具有按日期排列的数百万条记录,并希望在特定日期每天更新一次来自黑斑羚的记录。使用 java 时,我正在通过收集更新 1000 批 1 miliion 记录,但需要更多时间,有时是一天。我还尝试为特定日期创建 A 的新表副本并更新到该副本,然后再次将所有记录重新插入 A。但没有性能影响。

有什么

最好的方法可以让我在更短的时间内完成相同的任务?

在 Vertica 中创建包含 20 列的表 B,就像在 impala。

构建一个连接到 impala 和 Vertica 的 Java 程序。在该程序中,批量读取SELECT * FROM impala.B内存中的数组,并将该内存用作目标语句INSERT /*+DIRECT */ INTO vertica.B VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)的主机变量。

创建(或保留(与 50-col 表 A 具有相同结构和相同主键(理想情况下为一列(的临时表stg_A

截断临时表,然后截断INSERT /*+DIRECT */ INTO stg_A SELECT B.*, A.col21,A.col22 .... A.col50 FROM B JOIN A ON stg_A.id=A.id(如果id是主键(。这样可以确保 20 列来自黑斑羚,其余的来自目标。

最后,运行优化的合并:

MERGE /*+DIRECT*/
INTO A t
USING stg_A s
 ON s.id         = t.id
WHEN MATCHED THEN UPDATE SET
  id    = s.id
, col02 = s.col02
, col03 = s.col03
, col04 = s.col04
, col05 = s.col05
[...]    
    , col50 = s.col50
WHEN NOT MATCHED THEN INSERT VALUES (
  s.s.id
, s.s.col02
, s.s.col03
, s.s.col04
, s.s.col05
, s.[...]
, s.s.col50
);

当解释计划具有 INSERT 的完整访问路径和 DELETE 的完整访问路径,而没有 MERGE 的访问路径时,您将看到您的合并是优化的合并。

最新更新