VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

ANY子连接性能优化

背景介绍

当IN类型的子连接(即ANY子连接)为相关子连接时,若不支持提升该子连接,生成的查询计划将使用subplan类型的计划,相当于对外表的每一行都执行一次subplan,比较低效。

功能介绍

Vastbase支持对ANY子连接的查询进行性能优化,增强关联子连接的提升功能,生成更优的查询计划。

注意事项

该功能仅在V2.2 Build 15(Patch No.3)及以上数据库版本支持。

前置条件

设置GUC参数rewrite_rule,开启ANY子连接提升。

set rewrite_rule='enable_any_sublink_pullup_enhanced';

示例

1、创建测试表并插入数据。

create table tb_1188701
( id serial not null,
c1 date,
c2 date,
col2 varchar(20),
c3 varchar(20)
);
insert into tb_1188701(c1,c2,col2,c3) values(date '20200101'+generate_series(1, 200)::interval ,date'20200202'+generate_series(1, 200)::interval,generate_series(1, 1000),generate_series(1, 200));
insert into tb_1188701(c1,c2,col2,c3) values(date '20200101'+generate_series(20, 50)::interval ,date'20200202'+generate_series(20, 50)::interval,generate_series(1, 100),'B'||generate_series(1, 200));
insert into tb_1188701(id) values(generate_series(20, 50));

create table tb_1188701_1
( id serial not null,
c1 date,
c2 date,
col2 varchar(30),
c3 varchar(20)
);
insert into tb_1188701_1(c1,c2,col2,c3) values(date '20200103'+generate_series(1, 200)::interval ,date'20200201'+generate_series(1, 200)::interval,generate_series(1, 1000),'A'||generate_series(1, 200));
insert into tb_1188701_1(c1,c2,col2,c3) values(date '20200101'+generate_series(20, 50)::interval ,date'20200202'+generate_series(20, 56)::interval,generate_series(1, 100),generate_series(1, 200));
insert into tb_1188701_1(id) values(generate_series(20, 56));

create table tb_1188701_2
( id serial not null,
c1 date,
c2 date,
col2 varchar(30),
c3 int
);
insert into tb_1188701_2(c1,c2,col2,c3) values(date '20200201'+generate_series(1, 300)::interval ,date'20200302'+generate_series(1, 300)::interval,generate_series(1, 1000),generate_series(1, 100));
insert into tb_1188701_2(c1,c2,col2,c3) values(date '20200201'+generate_series(20, 60)::interval ,date'20200302'+generate_series(20, 60)::interval,generate_series(1, 90),generate_series(1, 50));
insert into tb_1188701_2(id) values(generate_series(20, 60));

2、查看符合条件的数据量。

select count(*)
from tb_1188701 t1
where
t1.id in (select t2.id from tb_1188701_1 t2 where t1.col2!=t2.col2+1);

返回结果如下:

 count
-------
  7200
(1 row)