GreatSQL优化技巧:半连接(semijoin)优化

何为半连接?

半连接是在GreatSQL内部采用的一种执行子查询的方式,semi join不是语法关键字,不能像使用inner joinleft joinright 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');