Oracle语句优化 (汇总)

news2024/11/26 1:58:19

     大部分写sql语句都是为了实现而实现,如果最后在投入使用的过程中没有很难接受的性能,基本不怎么去考虑其性能。最近刚好有点时间,对优化方面进修进修,以备不时之需。

  • 选择最有效率的表名顺序

     Oracle的解析器按照从右到左的顺序处理from子句中的表名,写在最后的表将会最先处理,所以在多个表的情况下,需要选择数据条数最少的作为基础表写最后。

  • where子句中的连接顺序

Oracle采用自下而上的顺序解析where子句,所以表之间的连接必须写在其它where条件之前,可以过滤掉最大数量记录的条件必须写在where子句的末尾。

  • select语句避免使用*

Oracle解析过程中会将*依次转换成所有列名,这个工作是通过查询数据字典完成的,意味着将耗费更多时间。

  • 用Truncate代替delete

当删除表中记录时,通常情况下,回滚段用来存放可以被恢复的信息,若未commit事务,Oracle会将数据恢复到删除之前的状态。而Truncate删除后数据将不能恢复,因此很少的资源被调用,执行时间也会很短。

  • 尽量多使用commit

可以释放资源,如:回滚段上用于恢复数据的信息,被程序语句获的锁,redo log buffer中的空间,Oracle为管理上面资源中的内部话费。

  • 用where替换having语句

having只会在检索出所有记录后才对结果进行过滤,这个处理需要排序,总计等操作。on、where、having都可以加条件的子句中,on是最先执行的,where次之,having最后。

  • 通过内部函数提高效率

复杂的sql往往牺牲了执行效率,能够运用函数解决问题也是非常重要的。

  • 使用表的别名

sql连接多个表时,使用表的别名并把别名前缀到每列上,这样一来可以减少解析的时间,也能减少由列名歧义引起的语法错误。

  • 用exists替代in,用 not exists 替代not in

无论哪种情况下,not in都是最低效的,因为它是对子查询中的表执行了一个全表遍历,我们可以用外连接(outer joins)或not exists。

 

  • 用exists替代distinct

e0462d02ab414fe08f371b56eadac534.jpg

  •  sql语句用大写的

因为Oracle总是先解析Sql语句,把小写字母转换成大写字母再执行。

  • 避免在索引列上使用Not

Not会产生在和在索引列上使用函数相同的影响,当Oracle遇到Not会停止使用索引转而执行全表扫描。

  • 避免在索引列上使用计算

where语句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。

低效:select name from dept where sal*12>5000;

高效:select name from dept where sal>5000/12;

  • 用>=替代>

低效:select name from dept where sal>=4;

高效:select name from dept where sal>3;

  • 优化group by

可以将不需要的记录在group by之前过滤掉。

低效:select job,avg(sal) from emo group job having job='j' or job='q';

高效:select job,avg(sal) from emo where  job='j' or job='q'  group job;

  • 用where替代order by

order by 中所有的列必须包含在相同的索引中,并保持在索引中的排列顺序;order by 中所有列必须定义为非空。如:表dept(code pk 不为空,id 不为空,name 可为空)

低效(索引不被使用)

select code from dept order by name;

高效(使用索引)

select code from dept where id>0;

  • 避免改变索引的类型

为避免Oracle对sql进行隐式的类型转换,最好把类型转换用显式表现出来。当字符和数值比较时,Oracle会优先转换成数值类型然后到字符类型。

  • 避免索引不起作用

在以下情况索引不起作用:

  1. '!='将不使用索引。记住索引只能告诉你什么存在表中,而不能告诉你什么不存在表中。
  2. '||'是字符连接函数。就像其它函数那样,停用了索引。
  3. '+'是数学函数,就像其它函数那样,停用了索引。
  4. 相同的索引不能相互比较,这将会启用全表扫描。

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

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

相关文章

【PHP面试题29】什么是PHP-FPM?它与PHP和Nginx有什么关系

文章目录 一、前言二、什么是PHP-FPM?三、PHP-FPM的生命周期3.1 启动阶段3.2 初始化阶段3.3 请求处理阶段3.4 关闭阶段 四、PHP-FPM与PHP的关系五、PHP-FPM与Nginx的通信方式六、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖P…

JavaScript 判断 null 、undefined、NaN的可靠方法、验证以及注意事项

索引 判断方法判断undefined判断null判断NaN 注意事项undefined和null和比较NaN和自己比较 有些时候需要判断类型是否为null、undefined或者NaN,常用的方法有以下: 判断方法 判断undefined 使用typeof typeof xxx undedfined注意:typeof…

Python+”多技术融合在蒸散发与植被总初级生产力估算

熟悉蒸散发ET及其组分(植被蒸腾Ec、土壤蒸发Es、冠层截留Ei)、植被总初级生产力GPP的概念和碳水耦合的基本原理;掌握利用Python与ArcGIS工具进行课程相关的操作;熟练掌握国际上流行的Penman-Monteith模型,并能够应用该…

低代码自动化解析:企业所需要了解的一切

根据2020年以来与低代码技术相关的积极趋势,Gartner预测到2023年低代码开发技术市场将增长20%。此外,他们还预计,到2026年,非正式IT部门的开发人员将占低代码开发工具用户群至少80%的比例,而这一比例在2021年为60%。基…

基本概念【变量和数据类型和运算符、二进制和十进制、十进制转二进制 、二进制转十进制 】(一)-全面详解(学习总结---从入门到深化)

目录 变量和数据类型和运算符 二进制和十进制的转化 十进制转二进制 二进制转十进制 注释 标识符和关键字 关键字/保留字 变量(variable) 变量的分类和作用域 常量(Constant) 基本数据类型(primitive data type) 整型 浮点型(Floating Point Number) 字符型 …

网工内推 | 坐标长沙,CKA、红帽、华为认证均可

01 上海海典软件 招聘岗位:运维工程师 职责描述: 1、负责和支撑业务系统日常运维工作; 2、负责公司机房网络设备、服务器的日常管理和维护; 3、负责公司电脑软件、硬件的安装及维护; 4、领导交办的其它事务。 任职要求…

行业内对低代码开发是什么看法?低代码/aPaaS未来将走向何方?

有人觉得低代码只是个概念,一无是处; 有人将低代码吹上了天,将其送上神坛; 我们先来看看低代码是什么。 低代码(Low-Code)顾名思义,是以少量的代码完成项目的开发。广义的低代码也包括零代码&a…

Shell第三章——循环语句与函数(2)

while循环:满足条件才会执行循环,不满足就结束,用于不知道循环次数,需要主动结束循环或者达到条件循环的场景 语法结构: while [ 条件判断 ] do 命令序列 done 例: 先在循环外把变量起好 let i 防止…

Python入门基础知识总结(赶紧收藏)

一:简介: Python 是一种解释型、面向对象的语言 Python的语法和动态类型,以及解释性语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言 二:Python基础语法 2.1.字面量 字面量:在代码中&am…

版本控制工具 - git的安装与使用

版本控制工具 - git的安装与使用 一、介绍二、git的下载与安装2.1 下载2.2 安装 三、git基本使用3.1 初始化git本地仓库3.2 把文件添加到版本库3.3 连接远程仓库 三、IntelliJ idea 中使用Git的配置3.1 配置git3.2 IDEA中 将本地项目提交到本地仓库和远程仓库(github)3.3 在 In…

算法----2 的幂

题目 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入:n 1 输出&#x…

算法与数据结构(二)--【2】链表进阶

一.循环链表 1.单循环链表/循环链表 【1】概念:在单链表中,将终端结点的指针域NULL改为指向第一个结点,就使整个链表形成一个环,这种首尾详解的链表成为循环链表。 【2】特点:从表中任一结点出发均可找到表中其他结点…

排序算法笔记-归并排序

归并排序 简介 通过找到中间值,然后递归分别从左区间和右区间找中间值,最终将所给的值划分为单个块,然后进行一步一步回溯,分块由两个单个分区排序后合成一个,以此类推,最后实现有序排序 时间复杂度 最…

小红书如何推广 方法总结

大家好,我是权知星球,今天来跟大家分享一下小红书如何推广,方法总结。 一、小红书介绍 小红书成立于2013年6月6日,最初的核心业务是社区内容分享。最初分享的主要是美妆和个人护理方面的内容。之后,平台扩展了分享内…

选择「程序员」职业的8个理由

软件开发人员是具有创建软件程序的创意和技术技能的专业人员,是一个具有高回报和挑战性的职业选择。如今,软件开发人员几乎在每个行业工作。随着世界变得越来越数字化,越来越需要具有技术背景的人来创建特定的软件应用程序。 如果您考虑做一…

opencv基础:环境配置

最近人工智能很火,所以蹭个热度,聊一个跨平台计算机视觉库----Opencv。 定义 先看一下其定义: OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、…

js手动画平滑曲线,贝塞尔曲线拟合

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"…

qt完整教程

各个组件的意思(功能介绍) Python Qt GUI设计:UI界面可视化组件、属性概述(基础篇—3)-腾讯云开发者社区-腾讯云 qt 如何设计好布局和漂亮的界面。_qt界面_花狗Fdog的博客-CSDN博客 样式表(美化关键)/*灰色*/ Q/*灰色*/ QWidget {background-color: rgb(255, 182, …

驱动第六次作业

应用test.t #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h>int main(int argc, char const *argv[]) {int number;int fd o…

Redis 从入门到精通【进阶篇】之redis主从复制详解

文章目录 0. 前言&#xff08;1&#xff09;概述&#xff08;2&#xff09; 主从复制设计的目的&#xff1a; 1. 原理解析1.1 全量复制1.2 增量复制 2. 主从节点配置3. 常见问题3.1. 当主服务器不进行持久化时复制的安全性3.2. 为什么主从全量复制使用RDB而不使用AOF&#xff1…