Oracle 常用SQL语句优化方式

浅分析Oracle语句优化规则 1. 选用适合的ORACLE优化器     ORACLE的优化器共有3种:    a. RULE (基于规则)       b. COST (基于成本)     c. CHOOSE (选择性)    设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL 阅读详情

一、Oracle 优化器的两种方式

1.RBO(Rule-Based Optimization)基于原则的优化器
优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则,对数据是不敏感的。它只借助少量的信息来 决定一个sql语句的执行计划,包括:
1)sql语句本身
2)sql中涉及到的table、view、index等的基本信息
3)本地数据库中数据字典中的信息(远程数据库数据字典信息对RBO是无效的)
2.CBO(Cost-Based Optimization)基于成本的优化器
通过代价引擎来估计每个执行计划所需的代价,该代价将每个执行计划所耗费的资源进行量化,CBO根据这个代价选择出最优的执行计划。一个查询所耗费的资源可分为三部分:
1)I/O代价:把数据从磁盘读入内存时所需代价(该代价是查询所需最主要的,所以在优化时一个基本原则就是降低I/O总次数)。
2)CPU代价:是指处理内存中数据所需的代价,数据一旦读入内存,当我们识别出我们所要的数据后,会在这些数据上执行排序(sort)或连接(join)操作,这需要消耗CPU资源。
3)NETWORK代价:对于访问远程节点来说,network代价的花费也是很大的。
优化器判断选用哪一种方式:
1)表及索引的统计信息。统计信息给出表的大小、有多少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做Analyze(解析)后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息。

二、SQL语句的常见优化方法

1.根据ORACLE解析器按照从右到左的顺序处理FROM子句中的表名的原理
FROM子句中写在最后的表将被最先处理. 可以分以下情况讨论:
1)在FROM子句中包含多个表的情况下, 你必须选择记录条数最少的表作为基础表.
2)当ORACLE处理多个表时, 会运用排序及合并 的方式连接它们.
首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并. 举例:
表 TAB1 的记录数远大于 表TAB2的
选择TAB2作为基础表 (最好的方法)
select count() from tab1,tab2
选择TAB2作为基础表 (不佳的方法)
select count(
) from tab2,tab1
注:如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
2.根据ORACLE解析器采用自下而上的顺序解析where子句的原理
表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
3.共享sql语句,避免重复解析相同的sql语句,提高sql的执行效能。共用sql需要满足三个条件:
1)执行语句必须与共享池语句完全一样,包括(大小写,空格,换行等)。
2)两条语句所指的对象必须完全相同。
3)两个SQL语句绑定变量的名字必须相同。
4.SELECT子句中避免使用 ‘ * ’星号
当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.
5.减少访问数据库的次数
当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量.
方法1 (低效) -
SELECT EMP_NAME , SALARY , GRADE FROM EMP
WHERE EMP_NO = 123;
SELECT EMP_NAME , SALARY , GRADE FROM EMP
WHERE EMP_NO = 456;
方法2 (高效)
SELECT A.EMP_NAME , A.SALARY , A.GRADE, B.EMP_NAME , B.SALARY , B.GRADE
FROM EMP A,EMP B
WHERE A.EMP_NO = 123
AND B.EMP_NO = 456;
6.Oracle数据库访问表中记录的方式有三种:
1)全表扫描(对于较大的表上尽量避免使用全表扫描)
2)通过ROWID访问表(Oracle存取单行数据的最快方法)
3)索引扫描(索引的正确使用可以有效地提升SQL语句的查询效率,但是如果有太多的索引,DML 的性能就会受到影响,而索引太少, 又会影响查询(包括插入、 更新和刪除) 的性能)
7.减少使用having
用Where子句替换HAVING子句,避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.
8.使用表的别名
当在sql语句中连接对个表的时候,请使用表的别名并把别名放在每个column的前面点出来;这样一来就可以减少解析的时间并且减少由column歧义引起的语法错误。
9.用exists可替换distinct;用表连接可替换exists。
10.用 UNION-ALL 替换UNION
当 SQL 语句需要 UNION 两个查询结果集合时,這两个结果集合会以 UNION-ALL 的方式被合并, 然后在输出最终结果前進行排序。 如果用 UNION ALL 替代 UNION , 这样排序就不是必要了,效率就会因此得到提高。
11.用exists(not exists)代替in(not in)
在子查询中,not in子句讲执行一个内部的排序和合并,而且对于子查询中的表执行一个全表遍历,所以效率比较低
12.索引方面的使用
1)索引只能告诉你什么存在于表中,而不能告诉你什么不存在表中。因此使用 ‘!=’ 将不使用索引,所以尽量避免使用 ‘!=’ 在sql语句中。
2)‘||’是字符连接符,在sql语句中将通知使用索引。
3)‘+’是数学函数,其他类似的数学函数也一样,在sql语句中停止使用索引
4)相同的索引列不能相互比较,这将会启动全表扫描;例如:
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);
使用索引:
SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,’%’);
5)ORDER BY 子句只在两种严格的条件下使用索引:
(1)ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
(2)ORDER BY中所有的列必须定义为非空.
6)如果索引是建立在多个列上, 只有在它的第一个列被where子句引用时,优化器才会选择使用该索引.
7)避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中.
例如:
如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.
低效: (索引失效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
高效: (索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;
8)避免在索引列上面使用计算
where子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描
例如:
select * from DEPT where sal*2<10000(低效)
select * from DEPT where sal<10000/2(高效)

【Oracle】Oracle优化53个规则详解 Oracle优化53个规则详解 阅读详情

相关推荐

ORACLE_SQL性能优化(这个很全的)

SQL语句执行的过程、ORACLE优化器 ,表之间的关联,如何得到SQL执行计划,如何分析执 行计划等内容,从而由浅到深的方式了解SQL优化的过 程,使大家逐步掌握SQL优化。

Oracle SQL语句之常见优化方法总结

下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1、SQL语句尽量用大写的;  因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。 2、使用表的别名:   当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来, 就可以减少解析的时间并减少那些由列歧义引起的语法错误。 3、选择最有效率的表名顺序(只在基于规则的优化器(RB

旺旺的博客 6万+

在Ubuntu 22.04上从零搭建TrinityCore 3.3.5服务器:一份保姆级避坑指南

本文详细介绍了在Ubuntu 22.04系统上从零搭建TrinityCore 3.3.5服务器的完整流程,包括环境准备、源码编译、数据库配置、资源文件处理及性能调优等关键步骤。特别针对国内开发者和低配置用户优化,提供保姆级避坑指南,帮助用户高效搭建魔兽世界经典旧世版本私服。

weixin_33393017的博客 304

ORACLE+SQL优化

Oracle数据库SQL优化相关的优化注意事项

qq_58774513的博客 3377

BIDS数据存储格式介绍与dcm2bids安装与使用

BIDS格式&dcm2bids安装与使用

machinelearning_er的博客 7312

长短期记忆网络(Long Short-Term Memory networks, LSTM)

如何简单的理解LSTM——其实没有那么复杂:

weixin_39910711的博客 2万+

Oracle数据库SQL优化详解

我们所执行的sql语句Oracle并不会直接去执行,而是经过数据库优化器优化以后再去执行。但是毕竟Oracle优化器也不是万能的,也有Oracle自身无法实现的优化语句,这就需要我们在书写sql语句的时候需要注意。注意SQL规范有助于避免SQL性能问题,也能避免不必要的异常。对于Oracle的sql语句优化也是有序可循的,按照步骤依次分析梳理,找出根源所在,针对性优化才有效果,而不是盲目来一通,以下是简单梳理优化步骤。...

m0_67402731的博客 5485

NCCL分布式训练中ibv_reg_mr_iova2内存分配失败的3种解决方案(附详细排查流程)

本文深入探讨了NCCL分布式训练中ibv_reg_mr_iova2内存分配失败的3种解决方案,包括快速临时修复、标准系统配置和PAM模块根治方案。详细分析了错误原因,提供了完整的排查流程和性能优化建议,帮助开发者高效解决RDMA网络环境下的内存锁定问题。

nut55的博客 625

Oracle数据库中的SQL优化

通过合理的索引设计、优化查询语句和使用适当的查询计划和统计信息,可以显著提高数据库的性能和响应速度。

renkejia1988的博客 3418

Huber损失函数中的阈值δ是如何确定的?

Huber损失函数通过阈值δ将误差划分为两部分:当误差小于等于δ时,采用平方损失(MSE),以保持对小误差的敏感性;当误差大于δ时,采用线性损失(MAE),以降低异常值对模型的影响。

百态·数智思维 | 聚焦大数据、量化与未来AI 1928

【GlobalMapper精品教程】074:从Lidar点云创建3D地形模型

本文基于地形点云数据,基于泊松方法、贪婪三角形测量方法和阿尔法形状创建3d地形模型。

智慧空间实验室 2167

Oracle SQL调优

Oracle SQL调优 1 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MOD

langmanchangfeng的专栏 501

【CANdelaStudio编辑CDD】-1.2-给$10服务SessionControl创建一个新Session会话并修改Session state machine会话状态机(UDS诊断)

前一篇:【UDS诊断描述文件CDD】-1.1-ISO_14229中$10服务理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/120375515案例背景: 在CDD中如何给$10服务创建一个新的Session会话; 在CDD中如何给$10服务修改Session state machine会话状态机。 目录 1 查看$10服务中已有的Session会话​ 2 查看$10服务中已有的Session state machine会话状态机 3 在$10...

「汽车电子助手」的博客 6074

Oracle性能优化技巧-性能调优

 1.选用适合的ORACLE优化器 中国网管联盟www.bitscn.com       ORACLE的优化器共有3种: 中国网管联盟www_bitscn_com       1.RULE(基于规则) 2.COST(基于成本) 3.CHOOSE(选择性) feedom.net     设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,CO...

dolphin_ygj 418

基于STM32L4XX、HAL库的RTL8211FSI-CG以太网收发器(PHY)驱动程序设计

一、简介:RTL8211FSI-CG是Realtek公司生产的一款高性能、低功耗的单端口10/100M以太网收发器(PHY)。它通过RMII(Reduced Media Independent Interface)或MII接口与MAC控制器连接。

zhusl6688的博客 531

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ORACLE SQL语句优化技术分析

ORACLE SQL语句优化技术分析 操作符优化     IN 操作符     用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。     但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:     ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,

天生我才必有用 1564

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Oracle SQL性能优化

oracle 性能优化

weixin_36837739的博客 4452

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Oracle SQL性能优化系列讲座之一

1. 选用适合的ORACLE优化器   ORACLE的优化器共有3种:   a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性)   设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进

334

Oracle sql 性能优化调整

Oracle sql 性能优化调整 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(

风之力的专栏 1439

面试中回答关于oracle数据库优化的方法

1关于优化器的优化配置 介绍oracle数据库优化的基本方式,基于规则的优化,基于规则包括全表扫描,扫描第一行 (需要上网查看一下) 基于成本的优化,基于选择的优化 也就是oracle的3种优化器,关于优化器的配置可以通过oracle数据库启动的时候通过初始化 数据库配置文件来配置 通过配置init.ora文件的optimizer_mode也就是优化模式的参数来 配置这个配置是一个全局

judyfun的专栏 766

Oracle的SQL语句优化(满满干货,建议收藏!)

1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执行计划” 2. 选用适合的Oracle优化器 RULE(基于规则)、 COST(基于成本) 、CHOOSE(选择性) 3. 访问Table的方式 全表扫描 全表扫描就是顺序地访问表中每条记录,ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描。 通过ROWID访

wj的博客 5477

oracle负责语句的优化,30个Oracle语句优化规则详解

30个Oracle语句优化规则详解1.选用适合的Oracle优化器Oracle的优化器共有3种:a.RULE(基于规则)b.COST(基于成本)c.CHOOSE(选择性)设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS。你当然也在SQL句级或是会话(session)级对其进行覆盖...

weixin_39817347的博客 128

Oracle sql语句执行顺序

 sql语法的分析是从右到左   一、sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。 3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。 4)表达式转换, 将复杂的 SQL 表达式转换为较简单的等效连接表达式。 5)选择优化器,不同的优化器一般产

afkbcgz的专栏 414

Oracle中SQL关于优化问题

一.编写初衷描述 在应有系统开发初期,由于数据库数据较少,对于sql语句各种写法的编写体现不出sql的性能优劣,随着数据的不断增加,出现海量数据,劣质sql与优质sql在执行效率甚至存在百倍差距,可见sql优化的重要性 二.Sql语句性能优化 2.1 认识Oracle的执行过程 2.2 Oracle优化法则—漏斗法则 2.3 Oracle 执行计划 2.3.1 什么是Oracle执行计划 执行...

Timothy的博客 515

Oracle性能优化技巧

Oracle性能优化技巧 1.选用适合的ORACLE优化器 ORACLE的优化器共有3种: 1.RULE(基于规则) 2.COST(基于成本) 3.CHOOSE(选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS...

未了之梦的专栏 121

转载---Oracle SQL性能优化的40条军规

转载来自:雪山上的蒲公英 1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执行计划” 2. 选用适合的Oracle优化器 RULE(基于规则) COST(基于成本) CHOOSE(选择性) 3. 访问Table的方式 全表扫描 ...

u014751885的专栏 145
上一篇: Redis环境的搭建--windows
下一篇: 前端页面HTML表格生成EXCEL下载
huahua.Dr
博客等级 码龄8年 87粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值