数据仓库服务 GAUSSDB(DWS)-案例:改写SQL消除in-clause:优化前

时间:2024-04-02 16:41:19

优化前

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

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

或者

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

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

1
2
3
4
5
SELECT 
ls_pid_cusr1,COALESCE(max(round((current_date-bthdate)/365)),0)
FROM calc_empfyc_c1_result_tmp_t1 t1,p10_md_tmp_t2 t2
WHERE 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/performance-dws/dws_10_0052.html