暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle语句优化(四)

原创 水煮鱼 2022-08-13
363

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; 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论