ORACLESQL性能优化系列(二)

ORACLESQL性能优化系列(二),第1张

ORACLESQL性能优化系列(二),第2张

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';

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » ORACLESQL性能优化系列(二)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情