ORACLE多表查询优化方案

ORACLE采取自下而上的顺序解析WHERE子句,依据这个原理,表其间的联接务须写在其余WHERE条件事前, 那些可以过滤掉最大数量记要的条件务须写在WHERE子句的末了.

  比如:

  (低效,执行时间156.3秒)

  SELECT …

  FROM EMP E

  WHERE SAL >; 50000

  AND JOB = ‘MANAGER’

  AND 25 < (SELECT COUNT(*) FROM EMP

  WHERE MGR=E.EMPNO);

  (高效率,执行时间10.6秒)

  SELECT …

  FROM EMP E

  WHERE 25 < (SELECT COUNT(*) FROM EMP

  WHERE MGR=E.EMPNO)

  AND SAL >; 50000

  AND JOB = ‘MANAGER’;

  着重点关切三:SELECT子句中避免运用 ‘ * ‘ .着重点关切

  当你想在SELECT子句中列出全部的COLUMN时,施用动态SQL列摘引 ‘*’ 是一个便利的步骤.不幸的是,这是一个十分低效的步骤. 实质上,ORACLE在解析的过程中, 会将’*’ 顺次转换成全部的列名, 这个工作是透过查询数据字典完成的, 这象征将消耗更多的时间.

  7. 减小访问数据库的次数

  应施行每条SQL话语时, ORACLE在内部实施了许多工作: 解析SQL话语, 预算目录的利用率, 绑定变量 , 读数据块之类. 有鉴于此, 减小访问数据库的次数 , 就能事实上减小ORACLE的工作量.

  比如,

  以次有三种步骤可以检索出雇员号即是0342或0291的员工.

  步骤一 (最低效)

  SELECT EMP_NAME , SALARY , GRADE

  FROM EMP

  WHERE EMP_NO = 342;

  SELECT EMP_NAME , SALARY , GRADE

  FROM EMP

  WHERE EMP_NO = 291;

  步骤二 (次低效)

  DECLARE

  CURSOR C一 (E_NO NUMBER) IS

  SELECT EMP_NAME,SALARY,GRADE

  FROM EMP

  WHERE EMP_NO = E_NO;

  BEGIN

  OPEN C一(342);

  FETCH C一 INTO …,..,.. ;

  OPEN C一(291);

  FETCH C一 INTO …,..,.. ;

  CLOSE C一;

  END;

本文来源:
我的异常网
Java Exception
Dotnet Exception
Oracle Exception

步骤三 (高效率)

  SELECT A.EMP_NAME , A.SALARY , A.GRADE,

  B.EMP_NAME , B.SALARY , B.GRADE

  FROM EMP A,EMP B

  WHERE A.EMP_NO = 342

  AND B.EMP_NO = 291;

  注意:

  在SQL*Plus , SQL*Forms和Pro*C中从新设立ARRAYSIZE参数, 可以增多历次数据库访问的检索数据量 ,提议值为200.

  着重点关切四:施用DECODE函数来减小处置时间.着重点关切

  应用DECODE函数可以避免反复扫描雷同记要或反复联接雷同的表.

  比如:

  SELECT COUNT(*),SUM(SAL)

  FROM EMP

  WHERE DEPT_NO = 0020

  AND ENAME LIKE ‘SMITH%’;

  SELECT COUNT(*),SUM(SAL)

  FROM EMP

  WHERE DEPT_NO = 0030

  AND ENAME LIKE ‘SMITH%’;

  你可以用DECODE函数高效率地失去雷同结果

  SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT,

  COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT,

  SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,

  SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL

  FROM EMP WHERE ENAME LIKE ‘SMITH%’;

  相仿的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.

  着重点关切五: 剔除重复记录.着重点关切

  最高效率的剔除重复记录步骤 ( 由于应用了ROWID)

  DELETE FROM EMP E

  WHERE E.ROWID >; (SELECT MIN(X.ROWID)

  FROM EMP X

  WHERE X.EMP_NO = E.EMP_NO);

  着重点关切六: 用TRUNCATE代替DELETE.着重点关切

  应剔除表中的记要时,在通常情况下, 来滚段(rollback segments ) 用于寄放可以被回复的信息. 如其你没COMMIT事宜,ORACLE会将数据回复到剔除事先的状态(正确地说是回复到实施剔除下令先期的景况)

  而应施用TRUNCATE时, 来滚段不再寄存任何可被回复的信息.应下令运作后,数据不能被回复.因而很少的资源被调用,执行时间也能很短.

  (译员按: TRUNCATE只在剔除全表实用,TRUNCATE是DDL不是DML)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值