Oracle语句优化规则的详解
来源:优易学  2011-1-4 15:20:48   【优易学:中国教育考试门户网】   资料下载   IT书店

  6.SELECT子句中避免使用‘ * ’
  当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用‘*’是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,Oracle在解析的过程中,会将‘*’依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。
  7.减少访问数据库的次数
  当执行每条SQL语句时,Oracle在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等等。由此可见,减少访问数据库的次数,就能实际上减少Oracle的工作量。
  例如,以下有三种方法可以检索出雇员号等于0342或0291的职员。
  方法1(最低效)
  SELECT EMP_NAME, SALARY, GRADE
  FROM EMP
  WHERE EMP_NO = 342;
  SELECT EMP_NAME, SALARY, GRADE
  FROM EMP
  WHERE EMP_NO = 291;
  方法2(次低效)
  DECLARE
  CURSOR C1 (E_NO NUMBER) IS
  SELECT EMP_NAME,SALARY,GRADE
  FROM EMP
  WHERE EMP_NO = E_NO;
  BEGIN
  OPEN C1(342);
  FETCH C1 INTO …,..,.. ;
  OPEN C1(291);
  FETCH C1 INTO …,..,.. ;
  CLOSE C1; END;
  方法3(高效)
  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。
  8.使用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子句中。
  9.整合简单,无关联的数据库访问
  如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)
  例如:
  SELECT NAME
  FROM EMP
  WHERE EMP_NO = 1234;
  SELECT NAME
  FROM DPT
  WHERE DPT_NO = 10 ;
  SELECT NAME
  FROM CAT
  WHERE CAT_TYPE =‘RD’;
  上面的3个查询可以被合并成一个:
  SELECT E.NAME , D.NAME , C.NAME
  FROM CAT C , DPT D , EMP E,DUAL X
  WHERE NVL(‘X’,X.DUMMY) = NVL(‘X’,E.ROWID(+))
  AND NVL(‘X’,X.DUMMY) = NVL(‘X’,D.ROWID(+))
  AND NVL(‘X’,X.DUMMY) = NVL(‘X’,C.ROWID(+))
  AND E.EMP_NO(+) = 1234
  AND D.DEPT_NO(+) = 10
  AND C.CAT_TYPE(+) = ‘RD’;
  (译者按:虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以读者还是要权衡之间的利弊)
  10.删除重复记录
  最高效的删除重复记录方法(因为使用了ROWID)
  DELETE FROM EMP E
  WHERE E.ROWID > (SELECT MIN(X.ROWID)
  FROM EMP X
  WHERE X.EMP_NO = E.EMP_NO);

上一页  [1] [2] [3] [4] [5] [6] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
热门课程培训