数据库中的WITH temp_a 类似临时表的使用-CTE表达式
个人随笔记录
当一个表的数据量过大时,在字段没有索引的情况下,查询的效率通常都会比较慢,如何能在不改变当前表结构的情况下让查询效率提升呢?
在一次偶然的巧合中看见同事使用了一个未见过语句,后面通过百度其语法的使用发现非常好玩的事情。
于是在一次工作中,有个领导突然提出一个需求,需要统计一个两个月内的开立了某个项目的相关信息,该项目名称没有全称,只有模糊字眼,但好彩的是知道这个项目属于哪个类别,并且该表中有这个类别字段。
由于该数据表每天的都有大量的数据产生,两个月该类别的数据就有21万。
光查询统计数据就用了2分钟。
于是我开始用普通语法进行模糊查询
模糊搜索查询了67秒,后面我转而一想,这样的执行顺序是
1、先从整表里取到8-9月的数据
2、然后再去过滤ITEM_CLASS等于C类的
3、再去模糊查询项目名称DRUG_NAME
这样一顿操作下来,感觉条件越多并且加上模糊查询效率是不是就降下来了。
刚好学习了临时表的使用,于是我就有个大胆的想法,为什么不先把,范围内的数据先存到临时表,再用条件去过滤临时表中的数据,这样的话是不是可以查询更快点。
于是开始实践
--创建临时表 WITH temp_a as( SELECT * FROM O*** A WHERE A.OPER_DATE>=to_date('2024-08-10 00:00:00','yyyy-mm-dd hh24:mi:ss') And A.OPER_DATE<=to_date('2024-09-08 23:59:59','yyyy-mm-dd hh24:mi:ss') And ITEM_CLASS='C' ) --查询临时表,查询语句需要跟着上面的临时表后面 SELECT * from temp_a K Where K.DRUG_NAME Like'%沙眼衣原体%' ;
发现确实快了很多,虽然具体的原理我没弄明白(大佬求解答),但是我的猜想确实是验证了,我个人的理解是如果是不先写入临时表查的话,就会走全表查询,单一个表的量级过大,查询的效率也会随之降低。但是如果先把范围数据先写入临时表,再通过条件是查询临时表的话,就属于精准取数,检索的数据就会减少,所以可以提升查询的数据。
当然以上那个也是个人的猜想,具体的底层原理还不了解,不过可以肯定的是这个语句真的挺好用的。特别是在处理复杂查询时,它通过分解查询、提高可读性,通过使用 CTE,可以将每个逻辑步骤分离出来,使得查询结构清晰。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体