打印本文 打印本文 关闭窗口 关闭窗口
ORACLESQL性能优化系列(三)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1862  更新时间:2009/4/22 23:22:09  文章录入:mintao  责任编辑:mintao

 

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’;

 

(译者按: 虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以读者 还是要权衡之间的利弊)

 

[1] [2]  下一页

打印本文 打印本文 关闭窗口 关闭窗口