文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

支持MERGE INTO命中索引时使用Bypass方法

可获得性

本特性自MogDB 5.0.0版本开始引入。

特性简介

为了提升的性能,本特性支持在MERGE INTO命中索引时使用Bypass方法,以提升MERGE INTO的性能。

客户价值

增强MogDB与Oracle的兼容性,减少应用程序的迁移代价。

特性约束

  • USING指定的引用必须明确返回一条件记录(比如sys_dummy视图)

  • ON条件必须能完整命中目标表索引(与IndexScan时支持Bypass相同)且只能使用确定的值(如常量或绑定变量)

  • ON条件查询分区表只支持生成的执行计划能确定到一个子表

  • MATCHED与NOT MATCHED中不能引用USING引用表(或视图)中的列

  • 有update时不支持更新分区字段

语法描述

MERGE INTO target_table [ [ AS ] target_alias ]
USING data_source ON join_condition
when_clause;
when_clause is:
{ WHEN MATCHED THEN merge_update |
  WHEN NOT MATCHED THEN merge_insert }

示例

-- 准备数据
create table tab_bypass(id integer, name text);
insert into tab_bypass select n,'name'||n from generate_series(1,100000) as foo(n);
create index on tab_bypass(id);
analyze tab_bypass;

-- 查看输出的信息中是否有"[Bypass]"
explain (costs off)
merge into tab_bypass using sys_dummy on(id=1)
when matched then update set name=name||'matched'
when not matched then insert (id,name) values(1,'name01');
-- 输出信息样例如下
                   QUERY PLAN                   
------------------------------------------------
 [Bypass]
 Merge on tab_bypass
   ->  Nested Loop Left Join
         ->  Result
         ->  Index Scan using tab_bypass_id_idx on tab_bypass
               Index Cond: (id = 1)


-- 使用prepare
prepare mystmt(integer) as
merge into tab_bypass using sys_dummy on(id=$1)
when matched then update set name=name||'matched'
when not matched then insert (id,name) values($1,'name'||$1);

-- 查看输出的信息中是否有"[Bypass]"
explain (costs off)
execute mystmt(10);
-- 输出信息样例如下
                   QUERY PLAN                   
------------------------------------------------
 [Bypass]
 Merge on tab_bypass
   ->  Nested Loop Left Join
         ->  Result
         ->  Index Scan using tab_bypass_id_idx on tab_bypass
               Index Cond: (id = $1)

-- 清理资源
deallocate mystmt;
Copyright © 2011-2024 www.enmotech.com All rights reserved.