Oracle语句优化53个规则详解(9)

39.       总是使用索引的第一个列

  如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引

    译者按:这也是一条简单而重要的规则。

 见以下实例

     SQL> create table multiindexusage inda number indb number descr varchar210));  Table created.

  SQL> create index multindex on multiindexusageindaindb);

  Index created.

 SQL> set autotrace traceonly 

    SQL> select *

 from multiindexusage

 where inda = 1

  Execution Plan

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

     0      SELECT STATEMENT Optimizer=CHOOSE

  1    0   TABLE ACCESS BY INDEX ROWID OF 'MULTIINDEXUSAGE'

  2    1     INDEX RANGE SCAN OF 'MULTINDEX' NON-UNIQUE

     SQL> select * from multiindexusage where indb = 1

  Execution Plan

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

     0      SELECT STATEMENT Optimizer=CHOOSE

  1    0   TABLE ACCESS FULL OF 'MULTIINDEXUSAGE'

     很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引

     40.       ORACLE内部操作

  当执行查询时,ORACLE采用了内部的操作。 下表显示了几种重要的内部操作。

ORACLE Clause

内部操作

ORDER BY

SORT ORDER BY

UNION

UNION-ALL

MINUS

MINUS

INTERSECT

INTERSECT

DISTINCT,MINUS,INTERSECT,UNION

SORT UNIQUE

MIN,MAX,COUNT

SORT AGGREGATE

GROUP BY

SORT GROUP BY

ROWNUM

COUNT or COUNT STOPKEY

Queries involving Joins

SORT JOIN,MERGE JOIN,NESTED LOOPS

CONNECT BY

CONNECT BY

    41.       UNION-ALL 替换UNION 如果有可能的话)

     SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序

     如果用UNION ALL替代UNION 这样排序就不是必要了。 效率就会因此得到提高。

     举例:

  低效:

  SELECT ACCT_NUM BALANCE_AMT  FROM DEBIT_TRANSACTIONS

  WHERE TRAN_DATE = 31-DEC -95

  UNION

  SELECT ACCT_NUM BALANCE_AMT

  FROM DEBIT_TRANSACTIONS

  WHERE TRAN_DATE = ‘31-DEC -95’

 高效:

  SELECT ACCT_NUM BALANCE_AMT

  FROM DEBIT_TRANSACTIONS

  WHERE TRAN_DATE = 31-DEC -95

  UNION ALL  SELECT ACCT_NUM BALANCE_AMT

  FROM DEBIT_TRANSACTIONS

  WHERE TRAN_DATE = ‘31-DEC -95’  

    译者按:需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录 因此各位还是要从业务需求分析使用UNION ALL的可行性。     UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存。 对于这块内存的优化也是相当重要的。 下面的SQL可以用来查询排序的消耗量

     Select substrname125 "Sort Area Name"

  substrvalue115   "Value"

  from v$sysstat

  where name like 'sort%'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值