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'; 虽然采取这种方法,效率得到提高,但是程序的可读性大大降低了。
10、删除重复记录
最高效的删除重复记录方法:
delete from emp e
where e.rowid > (select min(x.rowid) from emp x where x.emp_no = e.emp_no);
11、用 TRUNCATE 替代 DELETE
当删除表中的记录时,在通常情况下,回滚段(rollback segments)用来存放可以
被恢复的信息。如果你没有 COMMIT 事务,ORACLE 会将数据恢复到删除之前的状态(准确
地说是恢复到执行删除命令之前的状况)
而当运用 TRUNCATE 时,回滚段不再存放任何可被恢复的信息。当命令运行后,数据
不能被恢复。因此很少的资源被调用,执行时间也会很短。
TRUNCATE 只在删除全表适用,TRUNCATE 是 DDL 不是 DML。
12、尽量多使用 COMMIT
只要有可能,在程序中尽量多使用 COMMIT,这样程序的性能得到提高,需求也会因为
COMMIT 所释放的资源而减少:COMMIT 所释放的资源:
• 回滚段上用于恢复数据的信息
• 被程序语句获得的锁
• redo log buffer 中的空间
• ORACLE 为管理上述 3 种资源中的内部花费
13、计算记录条数
和一般的观点相反,count(*)比 count(1)稍快,当然如果可以通过索引检索,对索
引列的计数仍旧是最快的。例如 COUNT(EMPNO)。
14、用 Where 子句替换 HAVING 子句
避免使用 HAVING 子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤。这
个处理需要排序,总计等操作。如果能通过 WHERE 子句限制记录的数目,那就能减少这方
面的开销。
例如:
低效:select region, avg(log_size)
from location
group by region
having region region != 'SYDNEY' and region != 'PERTH';
高效:
select region, avg(log_size)
from location
where region region != 'SYDNEY'
and region != 'PERTH'
group by region;




