OceanBase 的 MERGE INTO 并行实现要点

今天给大家介绍 OceanBase Merge Into 用法,以及其并行的基本原理。

语法

Merge Into 语法是 SQL 中比较复杂的语法,一条语句可以涵盖增删改查四大模式。


MERGE [hint_options] INTO target_table_name [opt_alias] 
    USING source_table_name [opt_alias]
    ON (expr)
    [merge_update_clause] [merge_insert_clause] 
    
merge_update_clause:
    WHEN MATCHED THEN UPDATE SET update_asgn_list [WHERE expr] [DELETE WHERE expr]

merge_insert_clause:
    WHEN NOT MATCHED THEN INSERT opt_insert_columns VALUES '(' insert_vals ')' [WHERE expr]

语义方面最需要注意的是 DELTE 部分,它的意思是对 UPDATE 之后的结果做判断,如果符合条件则删除。

Specify the DELETE where_clause to clean up data in a table while populating or updating it. The only rows affected by this clause are those rows in the destination table that are updated by the merge operation. The DELETE WHERE condition evaluates the updated value, not the original value that was evaluated by the UPDATE SET … WHERE condition. If a row of the destination table meets the DELETE condition but is not included in the join defined by the ON clause, then it is not deleted. Any delete triggers defined on the target table will be activated for each row deletion.


https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/MERGE.html#GUID-5692CCB7-24D9-4C0E-81A7-A22436DC968F

并行要点

在 OceanBase 中实现 Merge Into 的并行,有三个要点:

  1. JOIN 部分是完全并行的。无论 USING ON 的部分多么复杂,本质就是一个 LEFT JOIN,并且 MERGE 源表作为 JOIN 的左表,MERGE 目标表作为 JOIN 的右表。对于 LEFT JOIN,所有 JOIN 并行的技术都可以应用在它上面。
  2. JOIN 的结果需要按照目标表的 old value 做分发。MERGE INTO 操作的最终目的不是对源表做任何修改,而是修改目标表,修改过程要符合目标表的各种操作约束,例如:更新目标表的同一行的操作要在同一个线程里,插入目标表的同一行操作也要在同一个线程里。
  3. 执行真正增删改命令的算子是 DISTRIBUTED MERGE 算子。它具备对语句做校验的能力,也具备对远程行做 DML 的能力。

用下面的例子来理解,可以更具体。假设 NAME 是主键。

MERGE INTO TEST_INFO_USER T1 USING T2
ON (T1.NAME = T2.NAME)
WHEN MATCHED THEN UPDATE SET T1.NAME = T2.NAME
WHEN NOT MATCHED THEN INSERT (NAME, AGE, DATA1) VALUES(T2.NAME,T2.AGE,T2.DATA1);

对于 MATCH 部分,按照 target 表做 shuffle 是 OK 的。
对于 NOT MATCH 的部分得按照源表的数据插入到 target 表,也应该按照 target 表做 hash

扩展

Databricks 扩展了语法的概念,包括 DELETE 的含义。Oracle 中,DELETE 仅仅是依附于 UPDATE 存在的,Databricks 可以独立的做 DELETE 操作,理论上更加灵活,表达能力更强。损失的是删除 UPDATE 结果的能力(重要吗?)。

对于 NOT MATCH 的概念,Databricks 也做了进一步的明确,分为 WHEN NOT MATCHED [BY TARGET]WHEN NOT MATCHED [BY SOURCE]

https://docs.databricks.com/sql/language-manual/delta-merge-into.html

参考资料

参考资料:OceanBase 语法介绍文档

你可能感兴趣的:(oceanbase,python,开发语言)