数据库中的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,可以将每个逻辑步骤分离出来,使得查询结构清晰。
数据库中的WITH temp_a 类似临时表的使用-CTE表达式的更多相关文章
- oracle数据库中创建表空间和临时表空间,以及用户和密码以及设置密码永不过期
首先进入oracle用户,命令是: su - oracle sqlplus /nolog connect system/123456@ora11g 或者 [oracle@localhost ~]$ ...
- SQL数据库中临时表、临时变量和WITH AS关键词创建“临时表”的区别
原文链接:https://www.cnblogs.com/zhaowei303/articles/4204805.html SQL数据库中数据处理时,有时候需要建立临时表,将查询后的结果集放到临时表中 ...
- Sqlserver数据库中的临时表详解
临时表在Sqlserver数据库中,是非常重要的,下面就详细介绍SQL数据库中临时表的特点及其使用,仅供参考. 临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除.临时表有两种类 ...
- C#关于数据库中存储的用户权限类似 "普通员工,管理员" 如何在代码中读取分析权限
之前在看某些数据库的用户权限的表时,发现字段是这样类似这样存储的" 普通员工,管理员 ",当时觉得他们是通过分割字符串来分析权限的.后来读到 Liam Wang 的 https ...
- Eclipse中java向数据库中添加数据,更新数据,删除数据
前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...
- 涂抹mysql笔记-数据库中的权限体系
涂抹mysql笔记-数据库中的权限体系<>能不能连接,主机名是否匹配.登陆使用的用户名和密码是否正确.mysql验证用户需要检查3项值:用户名.密码和主机来源(user.password. ...
- 在SQL2008查找某数据库中的列是否存在某个值
在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二: ...
- 分布式数据库中的Paxos 算法
分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...
随机推荐
- zynq 按照传统的Linux开发模式制作系统
参考资料 xilinx wiki: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/460653138/Xilinx+Open+Source ...
- 通向架构师的道路(第二十四天)之Oracle性能调优-朝拜先知之旅
前言 这次,我们将在Linux下来动手完成Oracle数据库的安装与使用. Oracle本身是可以免费下载的包括 它的企业版以及被它收购的Weblogic和Sun中的几乎任何东西你都可以拿来下载和使用 ...
- Git之常用文件
git项目中的特殊文件, 常见文件有.gitignore, .gitkeep 1) .gitkeep git默认是不允许提交一个空的目录到版本库上的, 可以在空的文件夹里面建立一个.gitkeep文件 ...
- navicat之常用操作
日常开发经常使用Navicat进行数据库的管理 快捷键: 快捷键 说明 F6 打开一个命令行界面 Ctrl + q 快速开启一个查询 ctrl + r 运行当前SQL ...
- 分析Java值传递与引用传递
背景 今天在公司做需求的时候,突然遇到了这个问题,八股文背过,但是又记不大清楚了.索性写下来,方便我这笨蛋脑子下次看. 解释 理解这个问题在于看它的角度(强调.加粗) 那我们开始,Java中一切都是值 ...
- GIT 使用SSH 方式提交代码
1.需求 一般情况下,我们在提交代码的时候,使用 HTTP的方式提交代码,这种方式有一个问题,提交时需要输入账号和密码,这个就不是很安全,git 提供了 SSH的方式. 下面就实际操作一下如何使用ss ...
- Echarts 提示组件
1.开启指示器 默认情况下,指示器是关闭状态,如果需要开启,直接配置tooltip字段即可 var option = { tooltip:{}, } 2.指示器的触发类型 触发类型的字段为trigge ...
- vue中this.$nextTick()
this.$nextTick()是在下一次DOM更新后执行其指定回调函数 this.$nextTick(回调函数) 使用场景:在改变数据后,要对更新后的DOM进行操作时使用
- ES6 面试题
新增了哪些属性? 新增块级作用域:let.const 新增数据类型:Symbol 表示独一无二的值 新增数据结构: Set,类似数组,所有数据是唯一的: Map,键值对的结合,传统的 Object 只 ...
- 常用bat代码
清除空文件夹 | 清理空文件夹 | 删除空文件夹 @echo off for /f "tokens=*" %%i in ('dir/s/b/ad^|sort /r') do rd ...