Like关联优化

1、问题

最近遇到这样有趣的写法

复制代码
with temp as
(select wm_concat(distinct code) code
from t1
)
select count(1) from (select distinct t2.id from t2,temp a where (a.code not like '%'||substr(t2.code,1,4)||'%')
) a

计划:

语句为了排除不在板块的单位,做法是先把单位code合并成一行进行模糊匹配排除。计划做成nest loop semi join2(嵌套循环),相当于一条一条去模糊匹配筛选排除,由此性能消耗高。

关联列一旦先合并处理之后,和其他表做关联时做成like关联匹配,这样的效率会低,因此不宜合并处理。

根据对语句的逻辑上理解,排除t2不在t1中的单位,且code的长度为4,"不在"可以转换成not exists,like关联转换成substr方式。

2、改写

复制代码
select count(1)
  from (select distinct t2.id
          from t2
         where not exists (select 1 
                  from t1 a 
                 where a.code=substr(t2.code,1,4) 
                   and lengthb(t2.code)=4 )) aa

计划:

性能提升几十倍。

3、小结

关联列一旦先合并处理之后,和其他表做关联时做成like关联匹配效率低,不宜这样处理。

相关推荐
zcn1266 天前
关于层次关系的数据统计
sql优化改写
zcn12614 天前
‘||’拼接条件写法的优化
sql优化改写
zcn1262 个月前
时间条件高效用法
数据库·sql优化改写
zcn1262 个月前
消除无关列
数据库·sql优化改写
zcn1263 个月前
先过滤后关联的优化经验分享
sql优化改写
zcn1263 个月前
union 和 union all的区别
sql优化改写
zcn1264 个月前
like关联改写
sql优化改写
zcn1264 个月前
OR关联改写经验
sql优化改写
zcn1266 个月前
标量子查询优化(二)
sql优化改写