整理oracle数据库sql优化.pptxVIP

  • 2
  • 0
  • 约3.23千字
  • 约 5页
  • 2021-01-23 发布于广东
  • 举报
使用绑定变量 (已测试)动态 sql 使用绑定变量beginfor i in 1..100000 loopexecute immediateinsert into t values(:x)using i;--绑定变量 end loop;end ;所用时间:3.562 sbeginfor i in 1..100000 loopexecute immediateinsert into t values(||i||);--未使用绑定变量 end loop;end ;所用时间:55.781sWHERE 子句中的连接顺序(已测试)所用时间:0.015sSELECT * FROM EMP E WHERE SAL 1000 AND JOB = MANAGER AND 1 (SELECT COUNT(*)FROM EMP WHERE MGR = E.EMPNO);所用时间:0.001s SELECT * FROM EMP E WHERE 1 (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL 1000 AND JOB = MANAGER;SELECT 子句中避免使用 ‘ * ’ (已测试) 当你想在 SELECT 子句中列出所有的 COLUMN 时,使用动态 SQL 列引用 ‘*’ 是一个方便的方法。不幸的是,这是一个非常低效的方法。 实际上,ORACLE 在 解析的过程中, 会将‘*’ 依次转换成所有的列名, 这个工作是通过查询数据 字典完成的, 这意味着将耗费更多的时间。 减少访问数据库的次数(已测试) 当执行每条 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;使用 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%’;整合简单,无关联的数据库访问(已测试) 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即 使它们之间没有关系) 例如: SELECT

文档评论(0)

1亿VIP精品文档

相关文档