熟悉oracle 的人都知道,对于两表的关联更新,其执行计划主要有 Filter 和 Outer Join 两种方式。对于大批量数据的update,Join方式明显是更优的选择。KingbaseES 和 Postgresql 也支持两种方式的关联update,语法上采用两种不同的写法。
以下以例子的形式展示两种写法及性能上的差异。这些例子同时通过KingbaseES V8R6和 Postgresql 12.3 环境验证。
一、准备测试数据
create table t1(id1 integer,name1 varchar(200));
create table t2(id2 integer,name2 varchar(200));
insert into t1 select * from (select generate_series(1,1000000),repeat('a',50)) as a order by random();
insert into t2 select * from (select generate_series(1,1000000),repeat('b',50)) as a order by random();
create index ind_t1_id1 on t1(id1);
create index ind_t2_id2 on t2(id2);
analyze t1;
analyze t2;
二、性能测试
1、语法一
采用类似oracle filter 方式,逐条处理t1 表的每条记录。对于t1表的每条记录,都需要访问t2表。
test=# explain analyze update t1 set name1=(select name2 from t2 where id1=id2);
Q