ORACLESQL性能優(yōu)化系列(十二)

字號:

39. 總是使用索引的第一個(gè)列
    如果索引是建立在多個(gè)列上, 只有在它的第一個(gè)列(leading column)被where子句引用時(shí),優(yōu)化器才會(huì)選擇使用該索引.
    譯者按:
    這也是一條簡單而重要的規(guī)則. 見以下實(shí)例.
    SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));
    Table created.
    SQL> create index multindex on multiindexusage(inda,indb);
    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’
    很明顯, 當(dāng)僅引用索引的第二個(gè)列時(shí),優(yōu)化器使用了全表掃描而忽略了索引
    40. ORACLE內(nèi)部操作
    當(dāng)執(zhí)行查詢時(shí),ORACLE采用了內(nèi)部的操作. 下表顯示了幾種重要的內(nèi)部操作.
    ORACLE Clause
     內(nèi)部操作
    ORDER BY
     SORT ORDER BY
    :smarttags" />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 SKEY
    Queries involving Joins
     SORT JOIN,MERGE JOIN,NESTED LOOPS
    CONNECT BY
     CONNECT BY
    41. 用UNION-ALL 替換UNION ( 如果有可能的話)
    當(dāng)SQL語句需要UNION兩個(gè)查詢結(jié)果集合時(shí),這兩個(gè)結(jié)果集合會(huì)以UNION-ALL的方式被合并, 然后在輸出最終結(jié)果前進(jìn)行排序.
    如果用UNION ALL替代UNION, 這樣排序就不是必要了. 效率就會(huì)因此得到提高.
    舉例:
     低效:
     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 將重復(fù)輸出兩個(gè)結(jié)果集合中相同記錄. 因此各位還是
    要從業(yè)務(wù)需求分析使用UNION ALL的可行性.
    UNION 將對結(jié)果集合排序,這個(gè)操作會(huì)使用到SORT_AREA_SIZE這塊內(nèi)存. 對于這
    塊內(nèi)存的優(yōu)化也是相當(dāng)重要的. 下面的SQL可以用來查詢排序的消耗量
    Select substr(name,1,25) "Sort Area Name",