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)