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

时间:2025-02-12 15:04:47

优化前

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

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

或者

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

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

12345
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/devg-dws/dws_04_0489.html