云数据库 GAUSSDB-案例:改写SQL消除in-clause:现象描述

时间:2024-04-26 16:15:04

现象描述

in-clause/any-clause是常见的SQL语句约束条件,有时in或any后面的clause都是常量,类似于:

1
select count(1) from calc_empfyc_c1_result_tmp_t1 where ls_pid_cusr1 in (20120405, 20130405);

或者

1
select count(1) from calc_empfyc_c1_result_tmp_t1 where ls_pid_cusr1 in any(20120405, 20130405);

但是也有一些如下的特殊用法:

1
SELECT ls_pid_cusr1,COALESCE(max(round((current_date-bthdate)/365)),0)FROM calc_empfyc_c1_result_tmp_t1 t1,p10_md_tmp_t2 t2WHERE t1.ls_pid_cusr1 = any(values(id),(id15))GROUP BY ls_pid_cusr1;

其中,id、id15为p10_md_tmp_t2中的两列,“t1.ls_pid_cusr1 = any(values(id),(id15))”等价于“t1.ls_pid_cusr1 = id or t1.ls_pid_cusr1 = id15”

因此join-condition实质上是一个不等式,这种非等值的join操作必须使用nestloop连接,对应执行计划如下:

support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0313.html