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

Oracle语句优化(二)

原创 水煮鱼 2022-08-11
321

4、选择最有效率的表名顺序(只在基于规则的优化器中有效)
ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM 子句中写
在最后的表(基础表 driving table)将被最先处理。在 FROM 子句中包含多个表的情况
下,你必须选择记录条数最少的表作为基础表。当 ORACLE 处理多个表时,会运用排序及合
并的方式连接它们。首先,扫描第一个表(FROM 子句中最后的那个表)并对记录进行派序,
然后扫描第二个表(FROM 子句中最后第二个表),最后将所有从第二个表中检索出的记录与
第一个表中合适记录进行合并。
例如:
表 TAB1 16, 384 条记录
表 TAB2 1 条记录
选择 TAB2 作为基础表(最好的方法):
select count(*) from tab1, tab2; --执行时间 0.96 秒
选择 TAB2 作为基础表(不佳的方法):
select count(*) from tab2, tab1; --执行时间 26.09 秒
如果有 3 个以上的表连接查询,那就需要选择交叉表(intersection table)作为基
础表,交叉表是指那个被其他表所引用的表。
例如:
EMP 表描述了 LOCATION 表和 CATEGORY 表的交集:
select *
from location l, category c, emp e
where e.emp_no between 1000 and 2000
and e.cat_no = c.cat_no
and e.locn = l.locn;
将比下列 SQL 更有效率:
select *
from emp e, location l, category c
where e.cat_no = c.cat_no
and e.locn = l.locn
and e.emp_no between 1000 and 2000;
5、 WHERE 子句中的连接顺序
ORACLE 采用自下而上的顺序解析 WHERE 子句,根据这个原理,表之间的连接必须写
在其他 WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾。
例如:
--低效,执行时间 156.3 秒
select *
from emp e
where sal > 50000
and job = 'MANAGER'
and 25 < (select count(*) from emp where mgr = e.empno);
--高效,执行时间 10.6 秒
select *
from emp e
where 25 < (select count(*) from emp where mgr = e.empno)
and sal > 50000
and job = 'MANAGER';  

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

评论