【Oracle】使用case when语句导致SQL查询速度很慢的情况
【Oracle】使用case when语句导致SQL查询速度很慢的情况
很多时候会使用到case when语句去对SQL的多种情况进行处理,decode也用的多,但是通常decode会用在固定值的数据处理上,而case when因为可以在其中增加语句,所以比较复杂的时候会用到
同时因为case when的结果集是从上到下的顺序进行,及优先级是自上而下的减少,例如下面的语句输出结果就是1
select
case when 1=1 then 1
when 2=2 then 2
end as flag
from dual
那么如果是复杂一点的情况呢,比如这种比较时间的情况,速度还是挺快的
select
case when ((select count(1) from dual where sysdate between to_date('2023-10-01','yyyy-mm-dd')and to_date('2023-10-03','yyyy-mm-dd')) > 0) then 1
when ((select count(1) from dual where sysdate between to_date('2023-07-01','yyyy-mm-dd')and to_date('2023-10-01','yyyy-mm-dd')) > 0) then 2
end as flag
from dual
那么再复杂一点的情况呢,比如当table1中的tt字段查询view123中的tt字段符合情况
select
case when ((select count(1) from view123 where table1.tt = view123.tt) > 0) then 1
when ((select count(1) from view123 where table1.tt = view123.tt) = 0) then 2
end as flag
from table1
会发现突然速度就下来了,但是如果找到数据单独执行这个语句,可能0.01秒内就可以执行出来,但是放在整个SQL中,可能会导致几十秒
select count(1) from view123 where table1.tt = view123.tt
这种很有可能因为case when的语句过于复杂,导致本来应该走索引的时候没走,可能还创建了临时表导致更加的慢
下午遇到的情况是一个视图,是第三层视图中的上层,在其中对某些日期进行条件分析,不同条件数据不同,同时还要对一个关联性不强的表进行一个数据集查询,在增加了case when以后,发现本来是十多秒的查询变成了五分钟才能出现结果,且在检查测试后发现是case when中的连表关系查询导致的
但是不能不用,因此,将这部分数据单独取出,放在第二层视图中作为一个变量,这样只使用一次的情况下,就增加了十秒的速度,还能接受,如果要彻底优化,最好直接将这个数据作为一个标识放在需要的表中,直接查表会快很多
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!