从 impala 更新 vertica 中的巨大记录
Update huge record in vertica from impala
我在 vertica 中有 table A 有 50 列,在 impala table B 中有 20 列。 Table 一个拥有数百万条记录的日期,并希望在特定日期每天从 impala 更新该记录。在使用 java 时,我正在通过收集 1 miliion 记录来更新 1000 个批次,但需要更多时间,有时甚至是一天。
我还尝试为特定日期创建 A 的新 table 副本并更新到该副本,然后再次将所有记录重新插入到 A。但没有性能影响。
为了让我能在更短的时间内完成同样的任务,最好的方法是什么?
在具有 20 列的 Vertica 中创建 table B,如 impala。
构建一个连接到 impala 和 Vertica 的 Java 程序。在该程序中,将 SELECT * FROM impala.B
批量读入内存中的数组,并使用相同的内存作为目标语句 INSERT /*+DIRECT */ INTO vertica.B VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
.
的主机变量
创建(或保留)一个具有相同结构和相同主键(最好是一列)的暂存 table stg_A
,作为 50-col table A.
T运行cate staging table,然后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 列来自 impala,其余来自目标。
最后,运行 优化合并:
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 的访问路径时,您将看到您的合并是优化合并。
我在 vertica 中有 table A 有 50 列,在 impala table B 中有 20 列。 Table 一个拥有数百万条记录的日期,并希望在特定日期每天从 impala 更新该记录。在使用 java 时,我正在通过收集 1 miliion 记录来更新 1000 个批次,但需要更多时间,有时甚至是一天。 我还尝试为特定日期创建 A 的新 table 副本并更新到该副本,然后再次将所有记录重新插入到 A。但没有性能影响。
为了让我能在更短的时间内完成同样的任务,最好的方法是什么?
在具有 20 列的 Vertica 中创建 table B,如 impala。
构建一个连接到 impala 和 Vertica 的 Java 程序。在该程序中,将 SELECT * FROM impala.B
批量读入内存中的数组,并使用相同的内存作为目标语句 INSERT /*+DIRECT */ INTO vertica.B VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
.
创建(或保留)一个具有相同结构和相同主键(最好是一列)的暂存 table stg_A
,作为 50-col table A.
T运行cate staging table,然后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 列来自 impala,其余来自目标。
最后,运行 优化合并:
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 的访问路径时,您将看到您的合并是优化合并。