在 Vertica 中创建具有 20 列的表 B,就像在 impala 中一样。
构建一个连接到 impala 和 Vertica 的 Java 程序。在该程序中,将SELECT * FROM impala.B 批量读取到内存中的数组中,并将同一内存用作目标语句INSERT /*+DIRECT */ INTO vertica.B VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 的主机变量。
创建(或保留)一个与 50 列表 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 列来自 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 的访问路径时,您将看到您的合并是优化的合并。