`
皆乐
  • 浏览: 133615 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle性能优化的基本准则总结

阅读更多
1:在进行多表关联时,多用 Where 语句把单个表的结果集最小化,多用聚合函数汇总结果集后再与其它表做关联,以使结果集数据量最小化
2:在两张表进行关联时,应考虑可否使用右连接。以提高查询速度
3:使用 where 而不是 having ,where是用于过滤行的,而having是用来过滤组的,因为行被分组后,having 才能过滤组,所以尽量用户 WHERE 过滤
4:使用 exists 而不用 IN 因为 Exists 只检查行的存在,而 in 检查实际值。
5:IN操作符
   用 IN 写出来的 SQL 的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。
   但是用 IN 的 SQL 性能总是比较低,原因是:
   对于用 IN 的 SQL 语句 ORACLE 总是试图将其转换成多个表的连接,如果转换不成功则先执行 IN里面的子查询,再查询外层的表记录
   如果转换成功就转换成多个表的连接。因此 不管理怎么,用 IN 的 SQL 语句总是多了 一个转换的

   过程。一般的 SQL 都可以转换成功。
   但对于含有分组统计等方面的 SQL 就不能转换了。因此在业务密集的SQL当中尽量不采用IN操作符。
6:NOT IN 操作符
   此操作强烈推荐不使用,因为其不能应用表的索引。
   如遇这种情况,应该用 EXISTS ,NOT EXISTS 或者(外连接+判断为空)方案代替。
7:<> 操作符
   不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。
   对于这种情况,可以用其它方式代替,如:
   A<>0 -> A>0 OR A<0
   A<>'' -> A>''
8:like 操作符
   遇到 需要用到 LIKE 过滤的SQL语句,完全可以用 instr 代替。处理速度将显著提高。
9:union操作符
   union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,
   删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史

   表union。如:
   select * from gc_dfys
   union
   select * from ls_jg_dfys
   这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,

   如果表数据量大的话可能会导致用磁盘进行排序。
   推荐方案:采用union ALL操作符替代union,因为union ALL操作只是简单的将两个结果合并后就返回。
   select * from gc_dfys
   union all
   select * from ls_jg_dfys
10 SQL书写的影响
   同一功能同一性能不同写法SQL的影响
   如一个SQL在A程序员写的为
   select * from zl_yhjbqk
   B程序员写的为
   select * from dlyx.zl_yhjbqk(带表所有者的前缀)
   C程序员写的为
   select * from DLYX.ZLYHJBQK(大写表名)
   D程序员写的为
   select *  from DLYX.ZLYHJBQK(中间多了空格)
   以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的

   原理,
   可以得出ORACLE对每个SQL都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写

   得完全相同则ORACLE只会分析一次,
   共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的

   信息,ORACLE也可以准确统计SQL的执行频率。
11:where后面的条件顺序影响
   where子句后面的条件顺序对大数据量表的查询会产生直接的影响,如
   select * from zl_yhjbqk where dy_dj = ’1KV以下’ and xh_bz=1
   select * from zl_yhjbqk where xh_bz=1  and dy_dj = ’1KV以下’
   以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都

   是全表扫描,
   第一条SQL的dy_dj = ’1KV以下’条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,
   在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录

   都进行dy_dj及xh_bz的比较,
   以此可以得出第二条SQL的CPU占用率明显比第一条低。
12:询表顺序的影响
   在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的

   情况下ORACLE会按表出现的顺序进行链接,
   由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行了统计分析,

   ORACLE会自动先进小表的链接,再进行大表的链接)
13:采用函数处理的字段不能利用索引,如:
   substr(hbs_bh,1,4)=’5400’,优化处理:hbs_bh like ‘5400%’
   trunc(sk_rq)=trunc(sysdate),优化处理:
   sk_rq>=trunc(sysdate) and sk_rq<trunc(sysdate+1)
   进行了显式或隐式的运算的字段不能进行索引,如:
   ss_df+20>50,优化处理:ss_df>30
   ‘X’||hbs_bh>’X5400021452’,优化处理:hbs_bh>’5400021542’
   sk_rq+5=sysdate,优化处理:sk_rq=sysdate-5
   hbs_bh=5401002554,优化处理:hbs_bh=’ 5401002554’,注:此条件对hbs_bh 进行隐式的

   to_number转换,因为hbs_bh字段是字符型。
   条件内包括了多个本表的字段运算时不能进行索引,如:
   ys_df>cx_df,无法进行优化
   qc_bh||kh_bh=’5400250000’,优化处理:qc_bh=’5400’ and kh_bh=’250000’
14:应用ORACLE的HINT(提示)处理
   提示处理是在ORACLE产生的SQL分析执行路径不满意的情况下要用到的。它可以对SQL进行以下方

   面的提示

   目标方面的提示:
   COST(按成本优化)

   RULE(按规则优化)

   CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)
   
   SELECT EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=’SCOTT’;

   ALL_ROWS(所有的行尽快返回)
   SELECT EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=’SCOTT’;

   FIRST_ROWS(第一行数据尽快返回)
   select *
     from xxx 
    where xxx;
   select *
     from xxx
    where xxx

   优化器提示:用它的目的是提高SQL语句的响应时间,快速的先返回 n 行。

   访问路径的提示
   FULL: 执行全表扫描
  
   ROID: 根据ROWID进行扫描

   INDEX: 根据某个索引进行扫描

   select * from emp where deptno=200 and sal>300;
   如果写了多个,则ORACLE自动选择最优的哪个
   select * from emp where deptno=200 and sal>300;
   INDEX_JOIN: 如果所选的字段都是索引字段(是几个索引的),那么可以通过索引连接就可访问到数据,而不需要访问

   表的数据。
   
   select deptno,sal from emp

   where deptno=20;
   INDEX_FFS: 执行快速全索引扫描

   select count(*) from emp;
   NO_INDEX: 指定不使用哪些索引
  
   select * from emp where deptno=200

   and sal>300;
   AND_EQUAL: 指定合并两个或以上索引检索的结果(交集),最多不能超过5个
   
   执行方法的提示:
   USE_NL(使用NESTED LOOPS方式联合)
   USE_MERGE(使用MERGE join方式联合)
   USE_HASH(使用HASH join方式联合)
  
   根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接.
   例如:
   SELECT A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C

   WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;


   将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.
   例如:
   SELECT BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM

   FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

  
   将指定的表与其他行源通过合并排序连接方式连接起来.
   例如:
   SELECT * FROM BSEMPMS,BSDPTMS

   WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

   
   将指定的表与其他行源通过哈希连接方式连接起来.
   例如:
   SELECT * FROM BSEMPMS,BSDPTMS

   WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 
   其它高级提示(如并行处理等等)
   ORACLE的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给ORACLE执行的一个建议,
   有时如果出于成本方面的考虑ORACLE也可能不会按提示进行。根据实践应用,一般不建议开发人员应用ORACLE提示,
   因为各个数据库及服务器性能情况不一样,很可能一个地方性能提升了,但另一个地方却下降了,
   ORACLE在SQL执行分析方面已经比较成熟,如果分析执行的路径不对首先应在数据库结构(主要是索引)、
   服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息是否正确这几方面分析。
分享到:
评论

相关推荐

    Oracle 性能优化之 SQL优化

    sql和oracle语句构建原则及优化,提高代码和机器执行效率。

    ORACLE SQL性能优化

    ORACLE SQL 性能优化 oracle SQL 优化准则

    Oracle数据库性能优化浅析

    对于数据库系统来说, 优化是一件非常重要的工作, 本文从SQL查询的内部原理、 oracle数据库服务器处理SQL的原理、oracle数据库 s q l 优化 原则 、 oracle SQL 怎 么优化几个方面对oracle 数据库 的性能优化进行了...

    OracleSql性能优化调整原则.doc

    OracleSql性能优化调整原则.doc

    Oracle数据库性能优化的艺术 (文平) 高清PDF扫描版

    《oracle数据库性能优化的艺术》是资深数据库专家、unix系统专家、系统架构师近20年工作经验的结晶。 《oracle数据库性能优化的艺术》内容高屋建瓴,用辩证法中的系统化分析方法,不仅从硬件(服务器系统、存储系统...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    第15章 RAC稳定性与性能优化 15.1服务器硬件 15.1.1 Firmware固件升级 15.1.2硬件设备兼容性 15.1.3 FC HBA卡冗余 15.1.4 Infiniband技术 15.1.5 RAC硬件结构案例 15.2操作系统 15.2.1认证操作系统 15.2.2...

    Oracle SQL 性能优化

    该文档提供了40条oracle有关的优化原则,能够较大程度得提高sqL编写水平,提高sql性能。

    高性能动态SQL Oracle数据安全 Oracle 数据库的聚簇技术 等等

    Oracle数据库处理时间基本准则 81 入侵Oracle数据库常用操作命令 82 Oracle数据库优化及其应用程序研究 83 Instance实例和数据库 85 Oracle数据缓冲区内部机制 85 Oracle 9i数据库密码重用规则分析 87 Oracle数据库...

    让Oracle跑得更快—Oracle 10g性能分析与优化思路ch03.pdf

    在这本书里读者将会学到作者在性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是作者在实践中长期积累的心得体会,当读者掌握了一些处理问题的基本思路之后,成为一名合格的DBA就是一件轻而易举...

    oracle 性能优化建议小结

    平时关注Oracle数据库的网友都知道,Oracle性能优化保证了Oracle数据库的健壮性。下面就此提出需要注意的两个原则。

    ORACLE9i_优化设计与系统调整

    §5.1 理解ORACLE性能优化 82 §5.1.1 响应时间与吞吐量的折衷 82 §5.1.2 临界资源 83 §5.1.3 过度请求的影响 83 §5.1.4 调整以解决问题 83 §5.2 优化的执行者 84 §5.3 设置性能目标 84 第7章 系统优化方法 85 ...

    让Oracle跑得更快—Oracle10g性能分析与优化思路

    让Oracle跑得更快—Oracle 10g性能分析与优化思路内容简介:在这本书里读者将会学到作者在性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是作者在实践中长期积累的心得体会,当读者掌握了一些...

    JDBC性能优化.pdf

    本系列的性能提示将为改善 JDBC 应用程序的性能介绍一些基本的指导原则,这其中 的原则已经被许多现有的 JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库 MetaData方法 只获取需要的数据...

    Oracle数据库性能优化技术开发者网络Oracle

    本文以数据库性能优化的基本原则为出发点,阐述了在数据库设计阶段如何避免竞争和如何优化数据访问,在数据库运行阶段如何从操作系统和数据库实例级别上调整内存和I/O来达到数据库性能优化的各种技术。 关键词:...

    oracle 官方培训

    基础管理+性能优化 1天 备份与恢复概述 配置数据库归档模式 用户管理的备份和恢复 Rman的备份和恢复 Oracle数据库优化概述 Oracle的内存优化 数据库配置与IO优化 诊断工具和等待事件 SQL优化原则和案例 Oracle 10g...

    Oracle优化—SQL优化

    数据库、数据表、数据表I/O优化原则 2、选用适合的ORACLE优化器 3、访问Table的方式 4、SQL语句性能诊断、执行计划 5、用索引提高效率 6、全表扫描及索引扫描的实例比较 7、诊断有问题的SQL 8、使用sql_trace/10046...

    Oracle数据库学习指南

    10.ORACLE性能调整1 11.ORACLE性能调整2 12.Oracle专家调优秘密 13.PL_SQL单行函数和组函数详解 14.PL-SQL 15.PLSQL异常处理初步 16.SQL语句性能调整原则 17.创建和使用分区的表 18.基于成本的优化...

    让Oracle跑得更快—Oracle 10g性能分析与优化思路

    在这本书里读者将会学到作者在性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是作者在实践中长期积累的心得体会,当读者掌握了一些处理问题的基本思路之后,成为一名合格的DBA就是一件轻而易举...

    关于Oracle数据库优化的几点总结

    数据库性能关键的因素在于IO,因为操作内存是快速的,但是读写磁盘是速度很慢的,优化数据库关键的问题在于减少磁盘的IO,个人理解应该分为物理的和逻辑的优化, 物理的是指oracle产品本身的一些优化,逻辑优化是指...

Global site tag (gtag.js) - Google Analytics