数据库中的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 ...
随机推荐
- Pgloader极简教程
目录 简介 安装 安装概述 CentOS编译安装 使用 命令行 配置文件迁移 可能遇到的错误 更多配置参考 总结 引用 简介 pgloader是一个数据同步工具,用来将数据从其它地方迁移到postgr ...
- Blazor 组件库 BootstrapBlazor 中AutoComplete组件介绍
AutoComplete组件介绍 AutoComplete组件和文本框基本上样子是一样的,只不过AutoComplete组件还带有一个下拉列表,可以从中选择对应的内容. 其同样继承自Bootstrap ...
- vue3 父子组件传值
父传子组件 <template> <div> <!-- 通过自定义属性传递值 --> <Subassembly :value="doc"/ ...
- NVM管理多个Node版本
在项目中,我们常常会遇到node版本问题的一些报错,像是vue 3需要node10以上版本,不同的 node-sass 版本需要安装不同的 node.js 版本,为了统一管理node版本,我们需要用 ...
- 工作中这样用MQ,很香!
前言 消息队列(MQ)是分布式系统中不可或缺的技术之一. 对很多小伙伴来说,刚接触MQ时,可能觉得它只是个"传话工具",但用着用着,你会发现它简直是系统的"润滑剂&quo ...
- [SpringBoot]浏览器输出中文乱码问题解决
问题情境: IDEA.Springboot.浏览器访问接口查看返回的JSON数据,发现中文乱码 解决方案: server: servlet: encoding: charset: UTF-8 enab ...
- IDEA和GIT关于文件中LF和CRLF问题
问题描述:项目软件安装shell脚本上git仓库管理,但拉取后,上linux运行报错. 问题思考:根据描述信息可以查看到\r字样,初步判别为换行符导致 1.将脚本文件移动至notepad++中,通过视 ...
- .NET 9 中的 多级缓存 HybridCache
HybridCache是什么 在 .NET 9 中,Microsoft 将 HybridCache 带入了框架体系. HybridCache 是一种新的缓存模型,设计用于封装本地缓存和分布式缓存,使用 ...
- IPV6禁用导致 RabbitMQ 无法启动的问题
问题现象 在开发的过程中遇到了 RabbitMQ 怎么也启动不起来的现象.查看 RabbitMQ 自身的启动日志,并没有发现有什么有用的报错信息,只是从某天开始就一直在打印重启的日志,尝试多次重启也不 ...
- Qt编写安防视频监控系统54-轮询配置
一.前言 视频监控系统中少不了用到视频轮询,按照设计的基本原则,先满足基本的用户需求,稳定跑起来,再去折腾更复杂的应用场景,于是本系统也做了个基本的视频轮询功能,可以设置轮询方案,给某个轮询方案设置轮 ...