MERGE语句介绍

thire
发布于 2022-9-20 11:30
浏览
0收藏

介绍

为了给业务带来更多的便利性,OceanBase支持了​​MERGE​​​语句。一条​​MERGE​​语句可以同时完成对一个张表的更新,插入和删除三种操作。内容发生变更的表一般称为Target Table;而插入或更新的内容来源往往是另一张表,一般称为Source Table

使用

语法

merge

MERGE语句介绍-鸿蒙开发者社区

merge_update_clause

MERGE语句介绍-鸿蒙开发者社区

merge_insert_clause


MERGE语句介绍-鸿蒙开发者社区

举例

这里通过一个例子来说明​​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

分类
标签
已于2022-9-20 11:30:25修改
收藏
回复
举报
回复
    相关推荐