MERGE语句介绍
介绍
为了给业务带来更多的便利性,OceanBase支持了MERGE
语句。一条MERGE
语句可以同时完成对一个张表的更新,插入和删除三种操作。内容发生变更的表一般称为Target Table;而插入或更新的内容来源往往是另一张表,一般称为Source Table。
使用
语法
merge
merge_update_clause
merge_insert_clause
举例
这里通过一个例子来说明MERGE
语句的使用。当前有t1和t2两张表,表结构和内容分别如下:
OceanBase (root@oceanbase)> select * from t2;+------+-------+| id | sales |
+------+-------+| 1 | 2 |
| 2 | 4 |
| 3 | 6 |
| 4 | 8 |
+------+-------+4 rows in set (0.01 sec)
OceanBase (root@oceanbase)> select * from t1;+------+-------+| id | sales |
+------+-------+| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+-------+3 rows in set (0.01 sec)
通过一条MERGE
语句对t1进行更新和插入操作。在这条语句中,如果t2中的row满足match condition
则对t1执行更新操作,否则对其执行插入操作。
OceanBase (root@oceanbase)>
merge into t1 using t2 on (t1.id = t2.id)
when matched then update set t1.sales = t2.sales * 2
when not matched then insert values(100, 100);Query OK (0.03 sec)
OceanBase (root@oceanbase)> select * from t1;
+------+-------+| id | sales |
+------+-------+| 1 | 4 |
| 2 | 8 |
| 3 | 12 |
| 100 | 100 |
+------+-------+4 rows in set (0.00 sec)
上例中,t2中id为1,2,3的row均与t1中id为1,2,3的row满足match condition
,此时执行更新操作update set t1.sales = t2.sales * 2
,因此TargetTable中的Sales分别被更新为4,8,12;而t2中id为4的row不满足match condition
,此时执行插入操作insert values(100,100)
,因此t1中新添加一条id为100、sales为100的row。
实现
这里继续通过上面的例子来说明MERGE
语句的实现原理。
explain
merge into t1 using t2 on (t1.id = t2.id)
when matched then update set t1.sales = t2.sales * 2
when not matched then insert values(100, 100)
|============================================
|ID|OPERATOR |NAME|EST.ROWS|COST|
---------------------------------------------|0 |MERGE | |4 |637 |
|1 | HASH LEFT OUTER JOIN| |4 |525 |
|2 | TABLE SCAN |t2 |4 |251 |
|3 | TABLE SCAN |t1 |4 |251 |
=============================================
我们通过执行计划来分析一下MERGE
语句的执行流程:
- t1与t2分别做scan,从存储获取数据;
- t2与t1按照
match condition
做左连接,并将连接后的row传递给Merge算子进行处理; - Merge算子处理下层算子传递上来的row。
- 当Merge算子处理的row是t2的row与t1的row连接的结果时,其执行Update操作;
- 当Merge算子处理的row是t2的row与NULL连接的结果时,其执行Insert操作。
因此,规避细节不去讨论,在实现思路上可以归纳为以下两点:
- 优化器根据语句中Source Table和Target Table生成一个Join算子;
- 实现一个同时具有更新、插入和删除功能的MERGE算子,同时该算子能够根据下层算子传递的结果执行相应的操作。
特别说明
看到这里,大家对于MERGE
语句会有种似曾相识的感觉,会认为其与INSERT...ON DUPLICATE
功能类似。MERGE
语句的一些功能地区可以通过INSERT...ON DUPLICATE
来完成,但是MERGE
语句要更加的强大。例如:
-
MERGE
语句并不要求match condition
中的column必须是主键,可以是任何column参与的表达式(甚至可以不包含任何column); - 一条
MERGE
语句可以执行同时对Target Table进行插入、删除和更新三种操作; -
MERGE
语句中可以对插入、删除和更新分别设置WHERE CONDITION
来决定对哪些row执行对应的操作。
总结
MERGE
语句的实现,使得用户可以将一些业务端的逻辑放到数据库来执行,原本多条的SQL语句和业务逻辑代码化成了一条简单的SQL语句,既简化了业务的代码又提高了执行的效率。
MERGE
语句又为OceanBase增添了一份色彩,无论是在OLTP还是OLAP,我们都将为大家带来更多的惊喜。
本文转载自公众号OceanBase