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 过滤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149980.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ret2dl_resolve

前言&#xff1a; ret2dl_resolve 是一种利用漏洞进行攻击的技术&#xff0c;主要针对使用动态链接库的程序。它的核心原理是利用程序的重定位机制&#xff0c;通过构造特定的函数返回地址&#xff0c;来劫持控制流并执行攻击者选择的代码。以下是对 ret2dl_resolve 原理的详细…

[oeasy]python035_根据序号得到字符_chr函数_字符_character_

字符(character) 回忆上次内容 上次了解了ord函数 ord 的意思是 ordinal(序号) ord函数 可以 根据字符得到序号 那么 可以 反过来 吗&#xff1f; 根据序号 得到字符可以 吗&#xff1f;&#x1f914; ord的逆运算 首先进入游乐场 ord 根据参数"h" 得到序号104 chr…

EtherCAT转Profient协议网关简述

Profinet 转 EtherCAT 的连接与通信问题一直是许多人关注的焦点&#xff0c;也常常给人们带来诸多困惑。在此&#xff0c;我们将深入剖析这一问题&#xff0c;并为大家提供切实可行的解决方案。WL-PN-ECATM型设备在这方面表现卓越&#xff0c;能够有效解决这一难题。接下来&…

视频制作软件哪个好?前十名推荐!

在视频制作领域&#xff0c;选择合适的软件是提升创作效率和作品质量的关键。本文将根据软件的适用人群&#xff1a;新手入门和专业领域&#xff0c;以及推荐的书籍&#xff0c;为您详细介绍视频制作软件的前十名。 新手入门级别&#xff1a; 1.影忆 功能特点&#xff1a;新手入…

实现领域驱动设计(DDD)系列详解:集成限界上下文

一个项目中通常存在着多个限界上下文&#xff0c;并且我们需要在它们之间进行集成。 在上下文映射图中存在两种主要形式&#xff1a;一种是通过绘制一些简单的框图来展示它们之间的集成关系&#xff1b;另一种则是通过代码来实现这些集成关系。 到了具体的技术实现&#xff0…

设计模式之备忘录

一、备忘录设计模式概念 备忘录模式&#xff08;Memento&#xff09; 是一种行为设计模式&#xff0c; 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 适用场景 当你需要创建对象状态快照来恢复其之前的状态时&#xff0c; 可以使用备忘录模式。当直接访问对象的…

羽毛球场馆预约系统,便捷管理预约

全国羽毛球运动的热度不断上升&#xff0c;在健身行业中掀起了一股羽毛球热潮。同时羽毛球运动的风靡&#xff0c;也吸引了不少人入局&#xff0c;各种大大小小的羽毛球馆不断出现&#xff0c;为大众的羽毛球喜好提供了场地。 随着互联网的发展&#xff0c;羽毛球馆也开始向线…

双控开关接入NVBoard

导入NVBoard git仓库&#xff1a;https://github.com/NJU-ProjectN/nvboard 按照ysyx手册的要求&#xff0c;初始化NVBoard项目。 由于GitHub在国外&#xff0c;可能会超时无响应&#xff1a; 解决方案是修改代理。 当前的运行环境是VM VirtualBox虚拟机&#xff0c;网卡是…

豆包PixelDance:超越Runway和Sora的AI视频模型出炉

2024年9月24日&#xff0c;北京——字节跳动在火山引擎发布会上&#xff0c;震撼发布了两款AI视频模型&#xff1a;豆包视频生成的PixelDance模型和Seaweed模型&#xff0c;标志着AI视频技术迈入了一个全新的纪元。今天&#xff0c;我们将聚焦于豆包PixelDance模型&#xff0c;…

ffplay播放器研究分析

ffplay研究分析意义 ffplay.c是FFmpeg源码⾃带的播放器&#xff0c;调⽤FFmpeg和SDL API实现⼀个⾮常有⽤的播放器。 例如哔哩哔哩著名开源项⽬ijkplayer也是基于ffplay.c进⾏⼆次开发。 ffplay实现了播放器的主体功能&#xff0c;掌握其原理对于我们独⽴开发播放器⾮常有帮助…

加固与脱壳01 - 环境搭建

虚拟机 VMWare 多平台可用&#xff0c;而且可以直接激活&#xff0c;需要先注册一个账号 https://support.broadcom.com/group/ecx/productdownloads?subfamilyVMwareWorkstationPro KALI 类Ubuntu系统&#xff0c;官方提供了 vmware 版本&#xff0c;直接下载就可以使用。…

Vue3:element-plus el-Table列表合计处理显示字符串类型/计算合计数值

需求整理 1.使用element组件库中的 el-table组件实现图上 底部当前页合计的功能。在一般的情况下&#xff0c;只需要计算数值部分的值&#xff0c;因为组件中的方法中处理的就是将值的类型转换成数值类型&#xff0c;像string类型的字符串的话&#xff0c;在进行转换的时候会出…

认识URL

目录 url定义 定义 实例 url组成 组成 大家看到这时是否会有疑问&#xff1a;我们常用的端口号8080和http默认端口号有什么关系&#xff1f; url定义 定义 url就是统一资源定位符&#xff0c;简称网址。目的是使用url用于访问网络上的资源 实例 url组成 组成 实例&a…

微信小程序开发第八课

一 公告 1.1 微信小程序端 #js###const api require("../../config/settings.js") Page({data: {noticeList: [{title: 公告标题1,create_time: 2024-04-25,content: 公告内容描述1&#xff0c;公告内容描述1&#xff0c;公告内容描述1。, // 可以根据实际情况添加…

如何用Stable Diffusion XL模型,绘制精致的二次元插图,学完就能用!

哈喽大家好&#xff0c;我是画画的小强&#xff0c;持续分享AI相关知识干活。 今天给大家推荐一款Stable Diffusion XL二次元模型&#xff0c;这款模型在C站的下载排行很高&#xff0c;而且质量绘制出的二次元人物和场景都非常的棒&#xff01;那么首先介绍一些什么是Stable D…

火了!清华大学终于把Python整理成动画片了,教学通俗易懂,学完即可就业!

在当今人工智能时代&#xff0c;编程技能的重要性日益凸显。而Python作为一门广泛应用且易于学习的编程语言&#xff0c;就受到了众多学习者的青睐。 清华大学&#xff0c;作为国内顶尖的高等学府&#xff0c;其教育资源与师资力量无需多言。这部动画版教程&#xff0c;正是集…

Frontiers出版社系列SCISSCI合集

【SciencePub学术】本期&#xff0c;小编根据WOS数据库&#xff0c;整理了一下Frontiers出版社系列的SCI&SSCI合集&#xff0c;以供各位学者投稿参考&#xff01; 来源&#xff1a;WOS数据库 Frontiers系列期刊中&#xff0c;Frontiers in Immunology以其5.7分的影响因子位…

st7735调试记录

由于该模块陪我已经超过十年&#xff0c;最近想起来学习下lvgl&#xff0c;于是乎将其拿出来&#xff0c;尝试使能该模块从而学会lvgl 第一步肯定是找到资料确定下该模块是否好用。于是到网络上找到如下资料进行验证&#xff1a; https://pan.baidu.com/s/1CEunLuGUqLABR6I0UZ…

海外云手机在电商运营中的优势解析

近年来&#xff0c;海外云手机被越来越多人熟知&#xff0c;凭借云计算与电子商务的结合&#xff0c;成为出海电商企业高效、灵活的运营工具。本文将从多个角度详细解析海外云手机在电商运营中的主要优势。 一、成本节约 相比传统出海电商所依赖的实体设备如手机和电脑&#xf…

RPC框架开发——理解项目功能

目录 一、RPC的概念 二、使用分布式架构 三、进一步改进 四、最终框架 一、RPC的概念 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种通信机制&#xff0c;使得客户端能够像调用本地函数一样调用远程服务器上的函数。本质上是客户端需要…