Oracle Sql语句优化

1.最高效的删除重复记录方法 (因为使用了ROWID)
  例子:
  DELETE FROM  EMP E  WHERE  E.ROWID > (SELECT MIN(X.ROWID) FROM  EMP X  WHERE  X.EMP_NO = E.EMP_NO);

2.在含有子查询的 SQL 语句中 , 要特别注意减少对表的查询
  例子:
  SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = (SELECT TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE  VERSION = 604)

3.用 EXISTS 替代 I N 、用 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‘ )

4.用 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 ) ;

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

6.在 java 代码中尽量少用连接符“+”连接字符串!代替(单线程:StringBuild;多线程:StringBuffer)

7.避免在索引列上使用计算.
  WHERE 子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
  举例 :
  低效:
  SELECT … FROM  DEPT  WHERE SAL * 12 > 25000;
  高效 :
  SELECT … FROM DEPT WHERE SAL > 25000/12;

8.用 >= 替代 >
  高效 :
  SELECT * FROM  EMP  WHERE  DEPTNO >=4
  低效 :
  SELECT * FROM EMP WHERE DEPTNO >3
  两者的区别在于 , 前者 DBMS 将直接跳到第一个 DEPT 等于 4 的记录而后者将首先定位到 DEPTNO=3 的记录并且向前扫描到第一个 DEPT 大于 3 的记录 .

9.用 UNION ALL 替换 OR ( 适用于索引列 )
  通常情况下 , 用 UNION 替换 WHERE 子句中的 OR 将会起到较好的效果 . 对索引列使用 OR 将造成全表扫描.  注意 , 以上规则只针对多个索引列有效 . 如果有 column 没有被索引 , 查询效率可能会因为你没有选择 OR 而降低 . 在下面的例子中 , LOC_ID 和 REGION 上都建有索引 .
  高效 :
  SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10
  UNION
  SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = “MELBOURNE”
  低效 :
  SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
  如果你坚持要用 OR, 那就需要返回记录最少的索引列写在最前面

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

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

Oracle Sql语句优化

时间: 2024-10-24 09:17:57

Oracle Sql语句优化的相关文章

Oracle SQL语句优化34条

非常好用的SQL语句优化34条 1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基 础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACL

Oracle系列:(31)Oracle SQL语句优化

(01)选择最有效率的表名顺序(笔试常考) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名, FROM子句中写在最后的表将被最先处理, 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表放在最后, 如果有3个以上的表连接查询,那就需要选择那个被其他表所引用的表放在最后. 例如:查询员工的编号,姓名,工资,工资等级,部门名       select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dname       f

浅谈ORACLE SQL语句优化经验

(1) 选择最有效率的表名顺序(只在基于规则的seo/' target='_blank'>优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.

Oracle大数据SQL语句优化

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描, 如: select id from t where num is null    可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则

Oracle SQL性能优化

转载自:http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection ta

SQL语句优化技术分析

摘自  http://www.cnblogs.com/wxj1020/archive/2008/04/27/1173638.html 最近几周一直在进行数据库培训,老师精湛的技术和生动的讲解使我受益匪浅.为了让更多的新手受益,我抽空把SQL语句优化部分进行了整理,希望大家一起进步. 一.操作符优化 1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以

&lt;转&gt;Oracle SQL性能优化

原文链接:http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection t

SQL系列 - SQL语句优化个人总结

关于SQL语句优化方法 有些是通用的(如避免Select *): 有些不同的数据库管理系统有所区别(如Where子句顺序): 然后必须根据实际环境进行调优,因为即使是相同的数据库和表,在数据量或其他环境变化之后,SQL效率可能是不同的.所以,优化不是一蹴而就的. 一些总结 下面是我在工作中,主要是Oracle环境下一些常用的SQL语句优化方法,仅供参考.当然,后续可以再深入研究下SQL执行计划.索引等. 指明需要的列 Selcet中每少提取一个字段,数据的提取速度就会有相应的提升.提升的速度还要

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)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行an