使用DECODE函数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表
例如:
SELECT COUNT(*)SUM(SAL)
FROMEMP
WHERE DEPT_NO =
AND ENAME LIKESMITH%;
SELECT COUNT(*)SUM(SAL)
FROMEMP
WHERE DEPT_NO =
AND ENAME LIKESMITH%;
你可以用DECODE函数高效地得到相同结果
SELECT COUNT(DECODE(DEPT_NOXNULL)) D_COUNT
COUNT(DECODE(DEPT_NOXNULL)) D_COUNT
SUM(DECODE(DEPT_NOSALNULL)) D_SAL
SUM(DECODE(DEPT_NOSALNULL)) D_SAL
FROM EMP WHERE ENAME LIKE SMITH%;
类似的DECODE函数也可以运用于GROUP BY 和ORDER BY子句中
整合简单无关联的数据库访问
如果你有几个简单的数据库查询语句你可以把它们整合到一个查询中(即使它们之间没有关系)
例如:
SELECT NAME
FROM EMP
WHERE EMP_NO = ;
SELECT NAME
FROM DPT
WHERE DPT_NO = ;
SELECT NAME
FROM CAT
WHERE CAT_TYPE = RD;
上面的个查询可以被合并成一个:
SELECT ENAME DNAME CNAME
FROM CAT C DPT D EMP EDUAL X
WHERE NVL(XXDUMMY) = NVL(XEROWID(+))
AND NVL(XXDUMMY) = NVL(XDROWID(+))
AND NVL(XXDUMMY) = NVL(XCROWID(+))
AND EEMP_NO(+) =
AND DDEPT_NO(+) =
AND CCAT_TYPE(+) = RD;
(译者按: 虽然采取这种方法效率得到提高但是程序的可读性大大降低所以读者 还是要权衡之间的利弊)
删除重复记录
最高效的删除重复记录方法 ( 因为使用了ROWID)
DELETE FROM EMP E
WHERE EROWID > (SELECT MIN(XROWID)
FROM EMP X
WHERE XEMP_NO = EEMP_NO);
用TRUNCATE替代DELETE
当删除表中的记录时在通常情况下 回滚段(rollback segments ) 用来存放可以被恢复的信息 如果你没有COMMIT事务ORACLE会将数据恢复到删除之前的状态(准确地说是
恢复到执行删除命令之前的状况)
而当运用TRUNCATE时 回滚段不再存放任何可被恢复的信息当命令运行后数据不能被恢复因此很少的资源被调用执行时间也会很短
(译者按: TRUNCATE只在删除全表适用TRUNCATE是DDL不是DML)
尽量多使用COMMIT
只要有可能在程序中尽量多使用COMMIT 这样程序的性能得到提高需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a 回滚段上用于恢复数据的信息
b 被程序语句获得的锁
c redo log buffer 中的空间
d ORACLE为管理上述种资源中的内部花费
(译者按: 在使用COMMIT时必须要注意到事务的完整性现实中效率和事务完整性往往是鱼和熊掌不可得兼)