数据库中的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 ...
随机推荐
- markdown小小白常用语法
第一次用vscode写笔记去同步Cnblog,不知道写啥就记点常用的md语法吧 1. 标题怎么写? 利用"#" + " " 即可实现第几节标题(其中'/',表转 ...
- vue父组件向子组件传递一个对象,使用一个对象绑定多个 prop
如果你想要将一个对象的所有属性都当作 props 传入,你可以使用没有参数的 v-bind,即只使用 v-bind 而非 :prop-name.例如,这里有一个 post 对象: export def ...
- vue 的provide 和 inject
1.功能说明 在开发过程中,在子组件中如何获取父组件或者祖父级的数据.这个我们之前的做法是在子组件中找到父组件实例,然后使用父组件的数据.这样其实不是很自然. 在vue 中提供了 provide 和 ...
- Echarts 坐标轴
1.坐标轴组件配置项总览 坐标轴分为x轴和y轴,操作这两个轴的字段分别为xAxis和yAxis var option = { xAxis:{ name:"月份", axisTick ...
- cv2, pil.image, plt.image 读图的差异
人是习惯性动物,当我们第一次用opencv时,肯定会觉得opencv的imread()方式很奇怪,做图像出来天天说图像是RGB图RGB图,可opencv读出来的图,却是BGR的顺序.是不是很奇怪,还不 ...
- vue3和elements创建应用
一. 创建环境 1. 创建D:\code\vue 文件夹 2. vscode打开文件夹 3. 打开终端,输入 npm install -g @vue/cli 4. 配置环境变量 终端输入:npm co ...
- 【Amadeus原创】免费的FTP软件Filezilla终极使用方法
FTP是两台异地终端传输大文件的利器. 最火也是最好用的FTP软件,当属FileZilla. 使用方法: 一.安装FileZilla 服务器端安装server版,客户端安装正常版, 下载地址:http ...
- 你应该了解的hooks式接口编程 - useSWR
什么是 useSWR ? 听名字我们都知道是一个 React 的 hooks,SWR 是stale-while-revalidate的缩写, stale 的意思是陈旧的, revalidate 的意思 ...
- Dockerr安装Oracle以及使用DBeaver连接
拉取镜像 pull container-registry.oracle.com/database/free:latest 创建容器 说明一下我现在的最新版本是23 docker run -d --na ...
- 开源产品测评之 SQL 上线能力
背景 近期,我司准备引入一款 SQL 审核产品来供内部流程使用,解决目前 SQL 人工上线的流程管控问题,目标是对业内的开源产品进行调研,选型一款作为落地方案,后期如果内部有需求可能会进行二次开发.我 ...