SQL常用技巧总结
查询优化基本准则
1、ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM 子句中写在最后的表(基础表 driving table)将被最先处理。
在FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。
例如:
表 TAB1 16384 条记录
表 TAB2 1 条记录
选择 TAB2作为基础表 (最好的方法)
select count() from tab1,tab2 执行时间 0.96秒
选择 TAB2作为基础表 (不佳的方法)
select count() from tab2,tab1 执行时间 26.09
2、ORACLE 采用自下而上的顺序解析 WHERE 子句,根据这个原理,表之间的连接必须写在其他 WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾。
例如:
(低效,执行时间 156.3秒)
SELECT … FROM
EMP E WHERE SAL > 50000 AND JOB =
‘MANAGER’ AND 25 < (SELECT COUNT() FROM EMP WHERE MGR=E.EMPNO);
(高效,执行时间 10.6秒)
SELECT … FROM EMP E WHERE 25 < (SELECT COUNT() FROM
EMP WHERE MGR=E.EMPNO) AND SAL > 50000 AND JOB = ‘MANAGER’;
3、减少对表的查询
在含有子查询的 SQL语句中,要特别注意减少对表的查询。
例如:
低效
SELECT TAB_NAME FROM
TABLES WHERE TAB_NAME = ( SELECT TAB_NAME
FROM TAB_COLUMNS WHERE VERSION = 604)
AND DB_VER= ( SELECT DB_VER FROM
TAB_COLUMNS WHERE VERSION = 604)
高效
SELECT TAB_NAME FROM TABLES WHERE
(TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS WHERE VERSION = 60;
4、用EXISTS替代IN
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这 种情况下, 使用 EXISTS(或 NOT EXISTS)通常将提高查询的效率。
使用 exists 而不用 IN 因为 Exists 只检查行的存在,而 in 检查实际。
例如:
低效
SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN
(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)
高效 SELECT * FROM EMP (基础表) WHERE
EMPNO > 0 AND EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO =
EMP.DEPTNO AND LOC = ‘MELB’)
用 IN 的 SQL 性能总是比较低,原因是:
对于用 IN 的 SQL 语句 ORACLE 总是试图将其转换成多个表的连接,如果转换不成功则先执行 IN里面的子查询,再查询外层的表记录如果转换成功就转换成多个表的连接。
因此,不管理怎么,用 IN 的 SQL 语句总是多了 一个转换的过程。
因此在业务密集的SQL当中尽量不采用IN操作符。
5、用NOT EXISTS替代 NOT IN
在子查询中, NOT IN子句将执行一个内部的排序和合并。 无论在哪种情况下, NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历而且不能应用表的索引)。
为了避免使用 NOT IN ,我们可以把它改写成外连接(Outer Joins)或 NOT EXISTS。
例如:
SELECT … FROM EMP WHERE DEPT_NO
NOT IN (SELECT DEPT_NO FROM DEPT
WHERE DEPT_CAT=‘A’);
为了提高效率。改写为:
SELECT …. FROM EMP E WHERE NOT EXISTS
(SELECT ‘X’ FROM DEPT D WHERE
D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = ‘A’);
6、用EXISTS替换DISTINCT
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT 子句 中使用 DISTINCT,一般可以考虑用 EXIST 替换。
例如:
低效:
SELECT DISTINCT DEPT_NO,DEPT_N FROM DEPT D,EMP E WHERE
D.DEPT_NO = E.DEPT_NO
高效: SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE
EXISTS ( SELECT ‘X’ FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
7、用表连接替换EXISTS
通常来说 ,采用表连接的方式比 EXISTS 更有效率。
例如:
SELECT ENAME FROM EMP E WHERE EXISTS (SELECT ‘X’ FROM DEPT WHERE
DEPT_NO = E.DEPT_NO AND DEPT_CAT = ‘A’);
为了提高效率。改写为:
SELECT ENAME FROM
DEPT D,EMP E WHERE E.DEPT_NO = D.DEPT_NO AND DEPT_CAT = ‘A’ ;
8、避免在索引列上使用计算
WHERE 子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
这是一个非常实用的规则,请务必牢记。
举例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12
9、避免在索引列上使用NOT
通常,我们要避免在索引列上使用 NOT,NOT 会产生在和在索引列上使用函数相同 的影响。当ORACLE“遇到”NOT,他就会停止使用索引转而执行全表扫描。
举例:
低效:(这里,不使用索引)
SELECT … FROM DEPT WHERE DEPT_CODE NOT = 0 ;
高效: (这里,使用了索引)
SELECT … FROM DEPT WHERE DEPT_CODE > 0
10、用>=替代>
举例:
如果 DEPTNO 上有一个索引,
高效: SELECT * FROM EMP WHERE DEPTNO >=4
低效:
SELECT * FROM EMP WHERE DEPTNO >3;
两者的区别在于, 前者 DBMS将直接跳到第一个 DEPT 等于4的记录而后者将首先 定位到 DEPTNO=3的记录并且向前扫描到第一个DEPT 大于3的记录。
11、<>操作符
不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描
举例: A<>0 -> A>0 OR A<0 A<>‘’ -> A>‘’
12、用(UNION)UNION ALL替换OR (适用于索引列)
通常情况下, 用 UNION替换 WHERE 子句中的 OR将会起到较好的效果。
对索引列使用 OR将造成全表扫描。注意, 以上规则只针对多个索引列有效。
如果有 column没有被索引, 查询效率可能会因为你没有选择 OR而降低。
在下面的例子中, LOC_ID 和 REGION上都建有索引。
低效: SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
高效: SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION WHERE REGION = “MELBOURNE”
如果你坚持要用 OR, 那就需要返回记录最少的索引列写在最前面。
注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率
可能会因为你没有选择OR而降低。
13、优化GROUP BY
提高 GROUP BY 语句的效率, 可以通过将不需要的记录在 GROUP BY 之前
过滤掉。下面两个查询返回相同结果但第二个明显就快了许多。
低效:
SELECT JOB , AVG(SAL) FROM EMP GROUP by JOB HAVING JOB =
‘PRESIDENT’ OR JOB = ‘MANAGE’
高效:
SELECT JOB , AVG(SAL) FROM EMP WHERE
JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’GROUP by JOB
使用 where 而不是 having ,where是用于过滤行的,而having是用来过滤组的,因为行被分组后,having 才能过滤组,所以尽量用 WHERE 过滤。
相关文章:
SQL常用技巧总结
查询优化基本准则 1、ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM 子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。 例如: 表 T…...
AJAX(简介以及一些用法)
AJAX 1. 简介 什么是 Ajax Ajax 的全称是 Asynchronous JavaScript And XML (异步 JavaScript 和 XML )我们可以理解为:在网页中 利用 XMLHttpRequest 对象和服务器进行数据交互的方式就是 Ajax ,它可以帮助我们轻松实现网页…...

美畅物联丨GB/T 28181系列之TCP/UDP被动模式和TCP主动模式
GB/T 28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》作为我国安防领域的重要标准,为视频监控系统的建设提供了全面的技术指导和规范。该标准详细规定了视频监控系统的信息传输、交换和控制技术要求,在视频流传输方面,GB/T 2…...

机器学习之实战篇——图像压缩(K-means聚类算法)
机器学习之实战篇——图像压缩(K-means聚类算法) 0. 文章传送1.实验任务2.实验思想3.实验过程 0. 文章传送 机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨详细笔记] 机器学习之监督学习(二)二元逻辑回归 …...

轴承介绍以及使用
轴承(Bearing)是在机械传动过程中起固定、旋转和减小载荷摩擦系数的部件。也可以说,当其它机件在轴上彼此产生相对运动时,用来降低运动力传递过程中的摩擦系数和保持转轴中心位置固定的机件。 轴承是当代机械设备中一种举足轻重的…...
【JAVA】算法笔记
一、ArrayList ArrayList类是一个可以动态变化的数组,与普通数组的区别就是它没有固定的长度。 ArrayList<String> arrList new ArrayList<String>(); arrList.add("吐泡泡"); System.out.println(arrList.get(0)); arrList.set(0,"J…...

Gnu Radio抓取WiFi信号,流程图中模块功能
模块流程如图所示: GNURadio中抓取WiFi信号的流程图中各个模块的功能: UHD: USRP Source: 使用此模块配置USRP硬件进行信号采集。设置频率、增益、采样率等参数。Complex to Mag^2: 将复数IQ数据转换为幅度的平方。Delay…...
GO语言中make与new的区别
区别 1 make不仅分配内存,还会初始化。 new只会分配零值填充的值2make只适用slice,map,channel的数据,new 没有限制3make返回原始类型(T),new返回类型的指针(*T) 源码中定义的区别 func make(t Type,size …IntegerType) Type func new(Type) *Type f…...
安全运维类面试题
1、你熟悉哪些品牌的安全设备 答:天融信的ngfw防火墙,老牌防火墙厂商,功能比较齐全,像流量检测,web应用防护和僵木蠕等模块都有,界面是红白配色,设计稍微有点老 2、IPS用的是哪个牌子的 答&…...

STM32外设之LTDC/DMA2D—液晶显示(野火)
文章目录 显示屏有几种?基本参数控制?显存 LTDC 液晶控制器LTDC 结构框图LTDC 初始化结构体 LTDC_InitTypeDefLTDC 层级初始化结构体 DMA2D 图形加速器DMA2D 初始化结构体 要了解什么 屏幕是什么,有几种屏,有什么组成。 怎么控制,不同屏幕控…...
调试vue build之后的js文件
调试 dist 目录下的 JavaScript 文件可以按照以下步骤进行: 1. 确保 Source Maps 正常生成 确认你的构建配置中已启用 Source Maps,确保 .map 文件与构建后的 .js 文件位于同一目录。 2. 启动一个本地服务器 使用本地服务器来服务 dist 目录…...
Django一分钟:DRF快速实现JWT认证与RBAC权限校验
一、项目创建并实现JWT认证 1. 下载依赖 下载django、djangorestframework、djangorestframework_simplejwt pip install django djangorestframework djangorestframework_simplejwt2. 创建项目 启动Django项目 django-admin startproject <myproject> cd myprojec…...
面试题(六)
48、设计模式 49、继承是否会破坏封装? 继承在面向对象编程中是一个重要的概念,但它确实可能对封装产生影响,具体情况取决于如何使用继承。以下是对这个问题的分析: 封装的定义 封装是面向对象编程中的一个基本原则࿰…...

CSS 实现文本溢出省略号显示,含单行与多行文本溢出
🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养ǹ…...
Redis中String命令的基础操作
文章目录 Redis中String命令的基础操作一、引言二、String类型的基础命令1、设置与获取值1.1、SET命令1.2、GET命令 2、字符串操作2.1、APPEND命令2.2、GETRANGE命令2.3、SETRANGE命令2.4、STRLEN命令 3、数值操作3.1、INCR命令3.2、DECR命令3.3、INCRBY和DECRBY命令 三、应用场…...
策略模式+模版模式+工厂模式
工厂模式: (1)避免类中出现过多的组合依赖 (2)同时减少代码中出现过多的if...else if...语句 (2)将调用者跟我们的实现类解耦 模版模式: (1)功能复用 &…...

云计算平台层(PaaS)指的是什么?常见的应用场景盘点
云计算平台层(PaaS)指的是什么?云计算平台层(PaaS),全称PlatformasaService(平台即服务),是云计算服务的一种重要模式。为用户提供了一个基于云端的开发和部署环境,允许用户开发、运…...

搜索引擎简介
搜索引擎架构 整个搜索引擎分为三个系统 爬虫系统 索引系统 线上搜素服务 爬虫系统 爬虫分为两个阶段: 第一阶段:根据目标网站的列表页,爬对应的文档 URL 第二阶段:根据文档 URL,下载文档内容 触发器࿱…...
每天认识几个maven依赖(aislib+A1TRMI+Andromda+Annogen)
十七、aislib 1、是什么? aislib用于与人工智能(AI)相关的任务。这可能包括支持机器学习、数据分析或其他 AI 功能的工具。用于集成或扩展 AI 功能到 Java 项目中。 2、有什么用? 机器学习: 提供各种机器学习算法和…...

每日算法1(快慢指针)
通过一道题来了解快慢指针 这是一道力扣的算法题,首先来读题,是删除链表的中间元素,先来分析一下题,链表一共有三种可能,第一种是空链表,第二种链表的个数是偶数,第三种是链表的个数是奇数&…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...