Oracle查询技巧

  1.WHERE子句中的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 2.SELECT子句中避免使用 ‘ *’:ORACLE在解析的过程中, 会将'*' 依次转

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

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

  3. 使用DECODE函数来减少处理时间:使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.

  4. 用TRUNCATE替代DELETE:当删除表中的记录时,在通常情况下, 回滚段(ROLLBACK SEGMENTS ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)

  5. 尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:

  COMMIT所释放的资源:

   回滚段上用于恢复数据的信息.

   被程序语句获得的锁

   REDO LOG BUFFER 中的空间

   ORACLE为管理上述3种资源中的内部花费

  6. 使用表的别名(ALIAS):当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个COLUMN上.这样一来,就可以减少解析的时间并减少那些由COLUMN歧义引起的语法错误.

  7. 用EXISTS替代IN、用NOT EXISTS替代NOT IN:在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(OUTER JOINS)或NOT EXISTS.

  例子:

  高效:

  SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')

  低效:

  SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')

  8. 用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

  高效:

  SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X'

  FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);

  9. SQL语句用大写的;因为ORACLE总是先解析SQL语句,把小写的字母转换成大写的再执行;

  10. 用WHERE替代ORDER BY:

   ORDER BY 子句只在两种严格的条件下使用索引.

   ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.

   ORDER BY中所有的列必须定义为非空.

  例如:

  表DEPT包含以下列:

  DEPT_CODE PK NOT NULL

  DEPT_DESC NOT NULL

  DEPT_TYPE NULL

  低效: (索引不被使用)

  SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE

  高效: (使用索引)

  SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0

  11. 优化GROUP BY:

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

  低效:

  SELECT JOB , AVG(SAL)

  FROM EMP

  GROUP JOB

  HAVING JOB = ‘PRESIDENT'

  OR JOB = ‘MANAGER'

  高效:

  SELECT JOB , AVG(SAL)

  FROM EMP

  WHERE JOB = ‘PRESIDENT'

  OR JOB = ‘MANAGER'

  GROUP JOB

分类:Oracle教程 时间:2013-05-05 人气:2
本文关键词:
分享到:

相关文章

  • oracle VM manager 3.1试验备忘录 2012-01-01

    1、下载oralce vm组件,需要外国的邮件地址。比如7mt.org,国内的不行,翻墙也不行。 2、如果用nfs做共享存储,一定要给足权限。 3、安装时,建议使用production(产品级安装)。如果选用“Demo”,会自动安装 oracle xe 11;而选择“Production”安装,则需要单独安装oracle数据库(标准版或者企业版)。 www.2cto.com 4、用浏览器登录管理 oracle vm manager时,在控制服务器上找不到相关报错信息, 这个折腾我好一阵子。请留意

  • Oracle中如何把表和索引放在不同的表空间里 2012-01-02

    Oracle中并没有区分表空间里放的是表还是索引,所有当数据量比较小时,完全可以把表和索引放在同一个表空间里,但随着数据量的增大,最好还是把表和索引分开存储在不同的表空间里 因为: 1)提高性能:尽量把表和索引的表空间存储在不同在磁盘上,把两类不同IO性质的数据分开放,这样可以提高磁盘的IO总体性能; 2)便于管理:试想一下,如果索引的数据文件损坏,只要创建索引即可,不会引起数据丢失的问题。 下面语句用于移动索引的表空间: 复制代码 代码如下: alter index INDEX_OWNER.I

  • Oracle数据库日常维护手册 2012-01-02

      在Oracle数据库运行期间,DBA应该对数据库的运行日志及表空间的使用情况进行监控,及早发现数据库中存在的问题。   一、Oracle警告日志文件监控   Oracle在运行过程中,会在警告日志文件(alert_SID.log)中记录数据库的一些运行情况:   ●数据库的启动、关闭,启动时的非缺省参数;   ●数据库的重做日志切换情况,记录每次切换的时间,及如果因为检查点(checkpoint)操作没有执行完成造成不能切换,会记录不能切换的原因;   ●对数据库进行的某些操作,如创建或删除

  • ORACLE字符拆分函?捣祷亟Y果集 2012-01-03

    ORACLE不能像MSSQL那?又С种苯臃祷乇眍?型,所以要先??建一?自定??型。??用到的是嵌套表(Nested Table)。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 -- Nested Table CREATE OR REPLACE TYPE split_str IS TABLE OF VARCHAR(

  • Oracle sqldev快捷键配置的一点小技巧 2012-01-04

    Oracle sqldev快捷键配置的一点小技巧 好吧,我没有全面研究过sqldev,不过有几个地方用起来不很方便,发现可以通过改快捷键来修正 1、代码智能补全提示 使用过eclipse的童鞋都习惯用alt+/ ,那么sqldev也是可以这样修改的 打开配置,找到快捷键 2、配置好alt+/ 来显示提示后,还有个问题,就是当出现的10个提示中,要选取第2个提示怎么办?sqldev提供的方式是 上下键来切换 对程序猿来说,当然用tab来切换要方便,同样是修改快捷键

  • Linux oracle 9i图文安装教程五 2012-01-05

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 前期工作:   前面已经讲到了安装Linux系统及加载相应的软件包,参考地址如下: Linux oracle 9i图文安装教程一(http://www.jb51.net/os/RedHat/9918.html), Linux oracle 9i图文安装教程二(http://www.jb51.net/os/RedHat/9919.html) Linux oracle 9i图文安装教程

  • Oracle函数wmsys.wm_concat的使用 2012-01-09

    首先介绍语法: wmsys.wm_concat Definition: The Oracle PL/SQL WM_CONCAT function is used to aggregate data from a number of rows into a single row, giving a list of data associated with a specific value. In effect, it cross-tabulates a comma delimited list.

  • PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法 2012-01-11

    PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法 PL/SQL查询时,如果Number(17)以上的大数,会显示为科学计数法 解决方法: TOOLS->PREFERENCES->WINDOW TYPE->SQL WINDOW下选中Number fields to_char即可。 来源 http://www.cnblogs.com/downmoon/archive/2012/12/05/2803802.html

  • Oracle 11g R2在CentOS 5.5服务器上的安装(上) 2012-01-11

    某银行研发部门新购置了一台IBM HS22刀片服务器,需要在上面安装linux系统,并在内部远程使用Telnet和FTP服务,以及安装Oracle数据库。 硬件环境: IBM HS22刀片服务器 系统软件: CentOS 5.5、Oracle 11g R2 安装实施: 本文出自 “300second的蜗居” 博客

  • [Oracle]Flashback闪回机制 2012-01-12

    [Oracle]Flashback闪回机制 Flashback的目的 在有Flashback之前,如果你对数据误操作,并已提交,这时想回退该误操作,将会是很件麻烦的事情。有人可能会说可以用备份恢复到误操作之前,但正确的操作数据也一起没了。唯一可能的办法就是日志挖掘,但日志挖掘非常繁琐,很难定位。 因此,Oracle推出了Flashback技术,主要目的就是为了恢复误操作。 Flashback家族介绍 数据库级别:Flashback Database 表级别:Flashback Drop和Flas

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.139 (s). 10 q(s)