暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 MogDB 2024-08-06
181

可获得性

本特性自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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论