Oracle sql优化

1> 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。
2> 不用NOT IN 操作符,可以用NOT EXISTS或者外连接+替代。
注解:Oracle 在执行IN子查询时,首先执行子查询,将查询结果放入临时表再执行主查询。
而EXIST则是首先检查主查询,然后运行子查询直到找到第一个匹配项。
3>SELECT子句中避免使用 ‘ * ‘:
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的,
这意味着将耗费更多的时间
4> 不用"<>" 或者"!=" 操作符。对 不等于操作符的处理会造成全表扫描,可以用"<" 或">"代替。
5> Where子句中出现IS NULL 或IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。
可以考虑在设计表时,对索引列设置为NOT NULL。这样就可以用其他操作来取代判断NULL的操作。
6> 当通配符"%" 或者为"_"作为查询字符串的第一个字符时,索引不会被使用。
7> 如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。
8> 避免在索引列上使用计算.WHERE子句中,假如索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
举例:
低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效: SELECT … FROM DEPT WHERE SAL > 25000/12;
9> 对数据类型不同的列进行比较时,会使索引失效。
10> 尽量多使用COMMIT:
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. ORACLE为治理上述3种资源中的内部花费
11> Oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写在其他WHERE条件
之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
12> 选择最有效率的表名顺序(只在基于规则的优化器中有效):
Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)
将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。假如有3个以上的
表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
13> Order by 语句中的非索引列会降低性能,可以通过添加索引的方式处理。严格控制在Order By语句
中使用表达式。
14> 不同区域出现的相同的Sql语句,要保证查询字符串相同,以利用SGA共享池,防止相同的Sql语句被
多次分析。
15> 多利用内部函数提高Sql效率。
16> 当在Sql语句中连接多个表时,使用表的别名,并将之作为每列的前缀。这样可以减少解析时间。
17> 优化GROUP BY:
提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.
下面两个查询返回相同结果但第二个明显就快了许多.
低效:
SELECT JOB , AVG(SAL) FROM EMP GROUP BY JOB HAVING JOB = ‘PRESIDENT' OR JOB = ‘MANAGER'
高效: SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT' OR JOB = ‘MANAGER' GROUP BY JOB
18> 用>=替代>
高效:
SELECT * FROM EMP WHERE DEPTNO >=4 低效:
SELECT * FROM EMP WHERE DEPTNO >3 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的 记录并且向前扫描到第一个DEPT大于3的记录.

我们可以总结一下可能引起全表扫描的操作:
@ 在索引列上使用NOT 或者 "<>"
@ 对索引列使用函数或者计算
@ NOT IN操作
@ 通配符位于查询字符串的第一个字符
@ IS NULL或者IS NOT NULL
@ 多列索引,但它的第一个列并没有被Where子句引用。

访问Table的方式
Oracle采用两种访问表中记录的方式:
1)全表扫描
全表扫描就是顺序地访问表中每条记录。Oracle采用一次读入多个数据块(database block)
的方式优化全表扫描。
2)通过ROWID访问表
你可以采用基于ROWID的访问方式情况,提高访问表的效率,ROWID包含了表中记录的物理
位置信息。Oracle采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常
索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值