可获得性
本特性自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;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




