原则一:注意WHERE子句中的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

尤其是“主键ID=?”这样的条件。

原则二: SELECT子句中避免使用 ‘ * ‘:ORACLE在解析的过程中,会将'*' 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间 。

简单地讲,语句执行的时间越短越好(尤其对于系统的终端用户来说)。而对于查询语句,由于全表扫描读取的数据多,尤其是对于大型表不仅查询速度慢,而且对磁盘IO造成大的压力,通常都要避免,而避免的方式通常是使用索引Index。

使用索引的优势与代价。

优势:

1)索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时,ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率.

2) 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型,你可以索引几乎所有的列. 通常,在大型表中使用索引特别有效. 当然,你也会发现,在扫描小表时,使用索引同样能提高效率.

代价: 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护,每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会 使查询反应时间变慢.。而且表越大,影响越严重。

使用索引需要注意的地方:

1、避免在索引列上使用NOT ,

我们要避免在索引列上使用NOT,NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.

2、避免在索引列上使用计算.WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描. 举例:

代码如下:

低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;

高效:SELECT … FROM DEPT WHERE SAL > 25000/12;

3、避免在索引列上使用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;

4、注意通配符%的影响使用通配符的情况下Oracle可能会停用该索引。如 :

代码如下:

SELECT…FROM DEPARTMENT WHERE DEPT_CODE like ‘%123456%'(无效)。

SELECT…FROM DEPARTMENT WHERE DEPT_CODE = ‘123456'(有效)

5、避免改变索引列的类型.:

当比较不同数据类型的数据时,ORACLE自动对列进行简单的类型转换.

假设 EMPNO是一个数值类型的索引列. SELECT … FROM EMP WHERE EMPNO = ‘123' 实际上,经过ORACLE类型转换,语句转化为: SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123') 幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. 现在,假设EMP_TYPE是一个字符类型的索引列. SELECT … FROM EMP WHERE EMP_TYPE = 123 这个语句被ORACLE转换为: SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123 因为内部发生的类型转换,这个索引将不会被用到! 为了避免ORACLE对你的sql进行隐式的类型转换,最好把类型转换用显式表现出来. 注意当字符和数值比较时,ORACLE会优先转换数值类型到字符类型

6、索引的一些“脾气”

a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.

b. 在特定情况下,使用索引也许会比全表扫描慢,但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!

除了使用索引,我们还有其他能减少资源消耗的方法:

1、用EXISTS替换DISTINCT:

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换,EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.

例子:

代码如下:

(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E

WHERE D.DEPT_NO = E.DEPT_NO

And E.sex =man

(高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D

WHERE EXISTS

( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO

And E.sex =man

);

2、用(UNION)UNION ALL替换OR (适用于索引列)

通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描.

注意,以上规则只针对多个索引列有效. 如果有column没有被索引,查询效率可能会因为你没有选择OR而降低. 在下面的例子中,LOC_ID 和REGION上都建有索引.

如果你坚持要用OR,那就需要返回记录最少的索引列写在最前面.

代码如下:

高效: SELECT LOC_ID,LOC_DESC,REGION FROM LOCATION WHERE LOC_ID = 10 UNION ALL

SELECT LOC_ID,REGION FROM LOCATION WHERE REGION = “MELBOURNE”

低效: SELECT LOC_ID,REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE”

3、用UNION-ALL 替换UNION ( 如果有可能的话):

当sql语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION,这样排序就不是必要了. 效率就会因此得到提高. 需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是要从业务需求分析使用UNION ALL的可行性. UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也是相当重要的.

4、Order By语句加在索引列,最好是主键PK上。

代码如下:

SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE(低效)

SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_CODE (高效)

5、避免使用耗费资源的操作:

带有DISTINCT,UNION,MINUS,INTERSECT的sql语句会启动sql引擎 执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作,而其他的至少需要执行两次排序. 通常,带有UNION,INTERSECT的sql语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好,使用UNION,INTERSECT也是可以考虑的,毕竟它们的可读性很强

6、使用Where替代Having(如果可以的话)优化GROUP BY:

提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.

代码如下:

低效:

SELECT JOB,AVG(SAL)

FROM EMP GROUP JOB HAVING JOB = ‘PRESIDENT'AND AVG(SAL)>XXX

高效:

SELECT JOB,AVG(SAL)

FROM EMP

WHERE JOB = ‘PRESIDENT'

OR JOB = ‘MANAGER' GROUP JOB Having AND AVG(SAL)>XXX

7、通常来说,如果语句能够避免子查询的 使用,就尽量不用子查询。因为子查询的开销是相当昂贵的。具体的例子在后面的案例“一条sql的优化过程”中。

如果你还有什么有关Oracle性能提升的建议可以到网站上的论坛里交流。

总结

以上是编程之家为你收集整理的oracle 性能优化建议小结全部内容,希望文章能够帮你解决oracle 性能优化建议小结所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

oracle 优化建议,oracle 性能优化建议小结相关推荐

  1. 服务器性能优化之网络性能优化

    hi ,大家好,今天分享一篇后台服务器性能优化之网络性能优化,希望大家对Linux网络有更深的理解. 曾几何时,一切都是那么简单.网卡很慢,只有一个队列.当数据包到达时,网卡通过DMA复制数据包并发送 ...

  2. 服务器性能优化和Mysql性能优化

    服务器性能优化和Mysql性能优化 影响性能的几个因素 服务器硬件 CPU 内存 IO子系统 服务器系统 CentOS系统参数优化 sysctlconf 优化 limitconf参数优化 磁盘调度策略 ...

  3. MySQL第12天:MySQL索引优化分析之性能优化案例实践

    MySQL索引优化分析之性能优化案例实践 执行计划中各select_type含义可以看:MySQL第11天:MySQL索引优化分析之性能分析 https://weibo01.blog.csdn.net ...

  4. oracle in 索引_Oracle 性能优化总结

    作者 | 帅性而为1号 出处 : https://blog.csdn.net/zhushuai1221/article/details/51740846 网上关于SQL优化的教程很多,但是比较杂乱.近 ...

  5. oracle bpm难点,Oracle Bpm 11g 审批性能优化

    背景 ​ 项目上协调办公.工作流使用的是Oracle Bpm的产品,最近被甲方爸爸投诉审批耗时长,希望能达到平均耗时1秒,甲方爸爸都要求了,没办法,于是就开始了一段痛苦的优化过程.本着普渡众生的想法, ...

  6. ++ 优化 频繁new_Java性能优化的50个细节,我必须分享给你!

    ↑↑↑点上方蓝字关注并星标⭐「IT技术思维」 一起培养顶尖技术思维 来源:blog.csdn.net/dongnan591172113/article/details/51790428 公众号:Jav ...

  7. ++ 优化 频繁new_Java性能优化

    在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间 ...

  8. MySQL的主动优化和被动优化_MySQL“被动”性能优化汇总!

    年少不知优化苦,遇坑方知优化难. --村口王大爷 本文内容导图如下: 我之前有很多文章都在讲性能优化的问题,比如下面这些: 当然,本篇也是关于性能优化的,那性能优化就应该一把梭子吗?还是要符合一些规范 ...

  9. Android 系统性能优化(15)---Android性能优化典范 - 第3季

    Android性能优化典范的课程最近更新到第三季了,这次一共12个短视频课程,包括的内容大致有:更高效的ArrayMap容器,使用Android系统提供的特殊容器来避免自动装箱,避免使用枚举类型,注意 ...

  10. Android 系统性能优化(14)---Android性能优化典范 - 第2季

    1)Battery Drain and Networking 对于手机程序,网络操作相对来说是比较耗电的行为.优化网络操作能够显著节约电量的消耗.在性能优化第1季里面有提到过,手机硬件的各个模块的耗电 ...

最新文章

  1. 用python爬虫的基本步骤-Python爬虫入门:爬虫基础了解
  2. 分享一个超棒的在线jQuery mobile原型设计开发工具 - codiqa
  3. opencv 车牌切割
  4. ROS总结一,catkin,package,CMakeList,Topic,node
  5. [导入]C#优化字符串操作【月儿原创】
  6. zookeeper学习03 使用场景
  7. 具有ReadWriteLock的Java并发
  8. 档案盒正面标签制作_错题本科学制作方法、正确使用方式及窍门
  9. html中可以自定义属性,,,妈的竟然才知道..
  10. dart string 转 bool_Dart语法篇之集合操作符函数与源码分析(三)
  11. iOS - OC 与 Swift 互相操作
  12. Mybatis-plus的两种分页插件的配置方式
  13. cdc2016年cypher资源_CDC最新Cypher!Ty.简直叼爆
  14. rs232接口_为什么越来越多人用RS232接口,却还分不清DB9、DB25的引脚定义?
  15. Unity 通过修改图片透明度实现淡出效果
  16. ajax 灯箱效果,灯箱效果插件Magnific Popup详解
  17. 打造可用的梅花6硬键盘
  18. html5绘制变换图形-旋转图形
  19. window.addEventlistener和document.addEventlistener区别
  20. 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码

热门文章

  1. emplace_back()
  2. NLP词向量和句向量方法总结及实现
  3. 第一单元 Java基础
  4. 矩阵矩阵的维度矩阵按某一维度进行拼接
  5. oracle将其他字段类型改为clob类型方法
  6. python的with open as f
  7. 如何在Linux系统上监测系统温度?(亲测可用)
  8. Java基础知识每日总结(19)---Java输入输出流、文件、递归
  9. Java多线程编程(四)——死锁问题
  10. 【算法设计与分析】1.主定理