=====================
1、合理使用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%';
这两个查询可以写成
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%';
用类似的方法也可以重新写GROUP BY 和ORDER BY子句。
----------------------
2、整合简单的查询
SELECT NAME FROM EMP WHERE EMP_NO = 1234;
SELECT NAME FROM DPT WHERE DPT_NO = 10 ;
SELECT NAME FROM CAT WHERE CAT_TYPE = ‘RD';
这三个查询可以写成:
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';
<理论如此,打死我也不会这么做~~~~~>
低效:
UPDATE EMP
SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),
SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
高效:
UPDATE EMP
SET (EMP_CAT, SAL_RANGE) = (
SELECT MAX(CATEGORY) , MAX(SAL_RANGE)
FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
--------------------------------
3、使用truncate代替delete
当删除表中记录时,要是回滚段来记录已经被删除的数据的信息,记录大量日志,用来做恢复使用
这样在操作的时候,对数据库来说是个不小的消耗
相反truncate是ddl,直接收回表所使用的空间,不记录日志,速度快,而且可以回收空间
----------------------------------
4、合理使用commit
commit后可以释放资源
a、释放回滚段上用于恢复数据的信息
b、释放锁
c、释放redo log buffer中的空间
d、为管理上述资源花费的内部消耗
但使用commit也要注意事务的完整性,而且过于频繁的commit也会带来性能的开销