GreatSQL优化技巧:半连接(semijoin)优化
何为半连接?
半连接是在GreatSQL内部采用的一种执行子查询的方式,semi join不是语法关键字,不能像使用inner join
、left join
、right join
这种语法关键字一样提供给用户来编写SQL语句。
两个表t1表和t2表进行半连接的含义是:对于t1表的某条记录来说,我们只关心在t2表中是否存在与之匹配的记录,而不关心有多少条记录与之匹配,最终的结果集中只保留t1表的记录。
前面文章也提到过,含in、exists子查询的语句通常会采用半连接方式执行查询,但这不绝对,也有一些情况不适用半连接。比如:
(1)外查询的where子句中,存在其他搜索条件使用OR操作符与IN子查询的条件连接起来
(2)IN子查询位于Select子句中
(3)IN子查询中含有union的情况
(4)IN子查询中含group by、having或聚合函数的情况
GreatSQL执行半连接的优化策略
本文实验使用数据库版本为GreatSQL 8.0.32-25。
创建两张实验表来说明。
greatsql> create table t1(
c1 varchar(30),
c2 int
);
greatsql> create table t2(
id int primary key,
c1 varchar(30),
key idx_c1(c1)
);
--插入几条测试数据
greatsql> insert into t1 values('a',1);
greatsql> insert into t1 values('b',3);
greatsql> insert into t1 values('a',5);
greatsql> insert into t1 values('c',7);
greatsql> insert into t1 values('d',9);
greatsql> insert into t2 values(1,'a');
greatsql> insert into t2 values(2,'a');
greatsql> insert into t2 values(3,'b');
greatsql> insert into t2 values(4,'b');
greatsql> insert into t2 values(5,'c');
greatsql> insert into t2 values(6,'b');