Oracle索引Index的优化设计(二)

2014-11-24 18:25:37 · 作者: · 浏览: 3
减少访问数据库的次数:


ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;


(5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200


(6) 使用DECODE函数来减少处理时间:******************************


使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.


decode (expression, search_1, result_1)


decode (expression, search_1, result_1, search_2, result_2)


decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n)


decode (expression, search_1, result_1, default)


decode (expression, search_1, result_1, search_2, result_2, default)


decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)


decode函数比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。


以下是一个简单测试,用于说明Decode函数的用法:


SQL> create table t as select username,default_tablespace,lock_date from dba_users;


Table created.


SQL> select * from t;


USERNAME DEFAULT_TABLESPACE LOCK_DATE


------------------------------ ------------------------------ ---------


SYS SYSTEM


SYSTEM SYSTEM


OUTLN SYSTEM


CSMIG SYSTEM


SCOTT SYSTEM


EYGLE USERS


DBSNMP SYSTEM


WMSYS SYSTEM 20-OCT-04


8 rows selected.


SQL> select username,decode(lock_date,null,'unlocked','locked') status from t;


USERNAME STATUS


------------------------------ --------


SYS unlocked


SYSTEM unlocked


OUTLN unlocked


CSMIG unlocked


SCOTT unlocked


EYGLE unlocked


DBSNMP unlocked


WMSYS locked


8 rows selected.


SQL> select username,decode(lock_date,null,'unlocked') status from t;


USERNAME STATUS


------------------------------ --------


SYS unlocked


SYSTEM unlocked


OUTLN unlocked


CSMIG unlocked


SCOTT unlocked


EYGLE unlocked


DBSNMP unlocked


WMSYS


8 rows selected.


(7) 整合简单,无关联的数据库访问:


如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)


(8) 删除重复记录:


最高效的删除重复记录方法 ( 因为使用了ROWID)例子:


DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)


FROM EMP X WHERE X.EMP_NO = E.EMP_NO);


(9) 用TRUNCATE替代DELETE:


当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)


(10) 尽量多使用COMMIT:


只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:


COMMIT所释放的资源:


a. 回滚段上用于恢复数据的信息.


b. 被程序语句获得的锁


c. redo log buffer 中的空间


d. ORACLE为管理上述3种资源中的内部花费


(11) 用Where子句替换HAVING子句:


避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不 符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,因为它过滤数据后 才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下w