W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
MERGE 算子用于將源表中的數(shù)據(jù)行以更新或插入的方式合并到目標(biāo)表中。
OceanBase 數(shù)據(jù)庫支持的 MERGE 算子包括 MERGE 和 MULTI PARTITION MERGE。
MERGE 算子用于合并數(shù)據(jù)表單個(gè)分區(qū)中的數(shù)據(jù)。
如下例所示,Q1 查詢將 src_tbl 表中的數(shù)據(jù)行合并到 t1 表中,對于 src_tbl 中的每一條數(shù)據(jù)行按照如下方式進(jìn)行合并:
當(dāng) t1 中存在滿足 t1.c1=src_tbl.c1
條件的數(shù)據(jù)行:
如果滿足 src_tbl.c2 > '100'
,則執(zhí)行更新操作,將 t1.c2
的值置為 src_tbl.c2
的值(目標(biāo)表中的每一行只會(huì)更新一次)。
如果不滿足 src_tbl.c2 > '100'
,則不執(zhí)行更新操作。
當(dāng) t1 中不存在滿足 t1.c1 = src_tbl.c1
條件的數(shù)據(jù)行:
如果滿足 src_tbl.c1 > 10
,則執(zhí)行插入操作,向 t1 中插入 (src_tbl.c1,src_tbl.c2)
。
如果不滿足 src_tbl.c1 > 10
,則不指定插入操作。
obclient>CREATE TABLE src_tbl (c1 INT PRIMARY KEY, c2 VARCHAR2(10));
Query OK, 0 rows affected (0.12 sec)
obclient>CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR2(10));
Query OK, 0 rows affected (0.12 sec)
obclient>CREATE TABLE t2 (c1 INT PRIMARY KEY, c2 VARCHAR2(10)) PARTITION BY HASH(c1)
PARTITIONS 10;
Query OK, 0 rows affected (0.12 sec)
Q1:
obclient>EXPLAIN MERGE INTO t1 USING src_tbl ON (t1.c1 = src_tbl.c1)
WHEN MATCHED THEN
UPDATE SET t1.c2 = src_tbl.c2 WHERE src_tbl.c2 > '100'
WHEN NOT MATCHED THEN
INSERT (t1.c1, t1.c2) VALUES (src_tbl.c1,src_tbl.c2) WHERE src_tbl.c1 > 10\G;
*************************** 1. row ***************************
Query Plan:
===============================================
|ID|OPERATOR |NAME |EST. ROWS|COST |
-----------------------------------------------
|0 |MERGE | |100001 |100001|
|1 | MERGE OUTER JOIN| |100001 |219005|
|2 | TABLE SCAN |SRC_TBL|100000 |61860 |
|3 | TABLE SCAN |T1 |100000 |61860 |
===============================================
Outputs & filters:
-------------------------------------
0 - output([column_conv(DECIMAL,PS:(38,0),NOT NULL,SRC_TBL.C1)], [column_conv(VARCHAR,utf8mb4_bin,length:10,NULL,SRC_TBL.C2)]), filter(nil),
columns([{T1: ({T1: (T1.C1, T1.C2)})}]), partitions(p0),
update([T1.C2=column_conv(VARCHAR,utf8mb4_bin,length:10,NULL,SRC_TBL.C2)]),
match_conds([T1.C1 = SRC_TBL.C1]), insert_conds([SRC_TBL.C1 > 10]),
update_conds([SRC_TBL.C2 > '100']), delete_conds(nil)
1 - output([SRC_TBL.C1], [SRC_TBL.C2], [T1.C1], [T1.C1 = SRC_TBL.C1], [T1.C2]), filter(nil),
equal_conds([T1.C1 = SRC_TBL.C1]), other_conds(nil)
2 - output([SRC_TBL.C1], [SRC_TBL.C2]), filter(nil),
access([SRC_TBL.C1], [SRC_TBL.C2]), partitions(p0)
3 - output([T1.C1], [T1.C2]), filter(nil),
access([T1.C1], [T1.C2]), partitions(p0)
其中,OUTER JOIN 是合并功能實(shí)現(xiàn)時(shí)依賴的一次聯(lián)接操作,使用 MERGE 算子時(shí),一定會(huì)在 source_table
和 target_table
上做一次外聯(lián)接,目的是為了區(qū)分哪些行是匹配的,哪些是不匹配的。
執(zhí)行計(jì)劃展示中的 outputs & filters 詳細(xì)列出了 MERGE 算子的輸出信息如下:
信息名稱 |
含義 |
---|---|
output |
該算子輸出的表達(dá)式。 |
filter |
該算子上的過濾條件。 由于示例中 MERGE 算子沒有設(shè)置 filter,所以為 nil。 |
columns |
插入操作涉及的數(shù)據(jù)表的列。 |
partitions |
插入操作涉及到的數(shù)據(jù)表的分區(qū)。 |
update |
更新操作中所有的賦值表達(dá)式。 |
match_conds |
源表和目標(biāo)表進(jìn)行匹配的條件。 |
insert_conds |
插入操作需要滿足的條件。 |
update_conds |
更新操作需要滿足的條件。 |
delete_conds |
刪除操作需要滿足的條件。 |
MULTI PARTITION MERGE 算子用于合并數(shù)據(jù)表多個(gè)分區(qū)中的數(shù)據(jù)。
如下例所示,Q2 查詢將 src_tbl 表中的數(shù)據(jù)行合并到分區(qū)表 t2 表中,對于 src_tbl 中的每一條數(shù)據(jù)行按照如下方式進(jìn)行合并:
當(dāng) t2 中存在滿足 t2.c1 = src_tbl.c1
條件的數(shù)據(jù)行:
執(zhí)行更新操作,將 t2.c2
的值置為 substr(src_tbl.c2, 1, 5)
的值(目標(biāo)表中的每一行只會(huì)更新一次)。
更新完成后,如果滿足 t2.c2 > '80000'
,則刪除對應(yīng)的數(shù)據(jù)行。
當(dāng) t2 中不存在滿足 t2.c1 = src_tbl.c1
條件的數(shù)據(jù)行,執(zhí)行插入操作,向 t2 中插入 (src_tbl.c1, src_tbl.c2)
。
Q2:
obclient>EXPLAIN MERGE INTO t2 USING SRC_TBL ON (t2.c1 = src_tbl.c1)
WHEN MATCHED THEN
UPDATE SET t2.c2 = SUBSTR(src_tbl.c2, 1, 5)
DELETE WHERE t2.c2 > '80000'
WHEN NOT MATCHED THEN
INSERT (t2.c1, t2.c2) VALUES (src_tbl.c1,src_tbl.c2)\G;
*************************** 1. row ***************************
Query Plan:
============================================================
|ID|OPERATOR |NAME |EST. ROWS|COST |
--------------------------------------------------------------
|0 |MULTI PARTITION MERGE | |100000 |100000 |
|1 | PX COORDINATOR | |100000 |956685 |
|2 | EXCHANGE OUT DISTR |:EX10001|100000 |899889 |
|3 | MERGE OUTER JOIN | |100000 |899889 |
|4 | EXCHANGE IN DISTR | |100000 |90258 |
|5 | EXCHANGE OUT DISTR (PKEY)|:EX10000|100000 |61860 |
|6 | TABLE SCAN |SRC_TBL |100000 |61860 |
|7 | SORT | |1000000 |5447108|
|8 | PX PARTITION ITERATOR | |1000000 |618524 |
|9 | TABLE SCAN |T2 |1000000 |618524 |
==============================================================
Outputs & filters:
-------------------------------------
0 - output([column_conv(DECIMAL,PS:(38,0),NOT NULL,SRC_TBL.C1)], [column_conv(VARCHAR,utf8mb4_bin,length:10,NULL,SRC_TBL.C2)]), filter(nil),
columns([{T2: ({T2: (T2.C1, T2.C2)})}]), partitions(p[0-9]),
update([T2.C2=column_conv(VARCHAR,utf8mb4_bin,length:10,NULL,SUBSTR(SRC_TBL.C2, 1, 5))]),
match_conds([T2.C1 = SRC_TBL.C1]), insert_conds(nil),
update_conds(nil), delete_conds([T2.C2 > '80000'])
1 - output([SRC_TBL.C1], [SRC_TBL.C2], [T2.C1], [T2.C1 = SRC_TBL.C1], [T2.C2]), filter(nil)
2 - output([SRC_TBL.C1], [SRC_TBL.C2], [T2.C1], [T2.C1 = SRC_TBL.C1], [T2.C2]), filter(nil), dop=1
3 - output([SRC_TBL.C1], [SRC_TBL.C2], [T2.C1], [T2.C1 = SRC_TBL.C1], [T2.C2]), filter(nil),
equal_conds([T2.C1 = SRC_TBL.C1]), other_conds(nil)
4 - output([SRC_TBL.C1], [SRC_TBL.C2]), filter(nil)
5 - (#keys=1, [SRC_TBL.C1]), output([SRC_TBL.C1], [SRC_TBL.C2]), filter(nil), is_single, dop=1
6 - output([SRC_TBL.C1], [SRC_TBL.C2]), filter(nil),
access([SRC_TBL.C1], [SRC_TBL.C2]), partitions(p0)
7 - output([T2.C1], [T2.C2]), filter(nil), sort_keys([T2.C1, ASC]), local merge sort
8 - output([T2.C1], [T2.C2]), filter(nil)
9 - output([T2.C1], [T2.C2]), filter(nil),
access([T2.C1], [T2.C2]), partitions(p[0-9])
上述示例的執(zhí)行計(jì)劃展示中的 outputs & filters 詳細(xì)列出了 MULTI PARTITION MERGE 算子的輸出信息,字段的含義與 MERGE 算子相同。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: