海鷗航際

          JAVA站
          posts - 11, comments - 53, trackbacks - 1, articles - 102
           

          31.       強(qiáng)制索引失效

           

            

          如果兩個(gè)或以上索引具有相同的等級(jí),你可以強(qiáng)制命令ORACLE優(yōu)化器使用其中的一個(gè)(通過(guò)它,檢索出的記錄數(shù)量少) .

           

          舉例:

            

          SELECT ENAME

          FROM EMP

          WHERE EMPNO = 7935 

          AND DEPTNO + 0 = 10    /*DEPTNO上的索引將失效*/

          AND EMP_TYPE || ‘’ = ‘A’  /*EMP_TYPE上的索引將失效*/

           

          這是一種相當(dāng)直接的提高查詢(xún)效率的辦法. 但是你必須謹(jǐn)慎考慮這種策略,一般來(lái)說(shuō),只有在你希望單獨(dú)優(yōu)化幾個(gè)SQL時(shí)才能采用它.

           

          這里有一個(gè)例子關(guān)于何時(shí)采用這種策略,

           

          假設(shè)在EMP表的EMP_TYPE列上有一個(gè)非唯一性的索引而EMP_CLASS上沒(méi)有索引.

           

          SELECT ENAME

          FROM EMP

          WHERE EMP_TYPE = ‘A’

          AND EMP_CLASS = ‘X’;

           

          優(yōu)化器會(huì)注意到EMP_TYPE上的索引并使用它. 這是目前唯一的選擇. 如果,一段時(shí)間以后, 另一個(gè)非唯一性建立在EMP_CLASS,優(yōu)化器必須對(duì)兩個(gè)索引進(jìn)行選擇,在通常情況下,優(yōu)化器將使用兩個(gè)索引并在他們的結(jié)果集合上執(zhí)行排序及合并. 然而,如果其中一個(gè)索引(EMP_TYPE)接近于唯一性而另一個(gè)索引(EMP_CLASS)上有幾千個(gè)重復(fù)的值. 排序及合并就會(huì)成為一種不必要的負(fù)擔(dān). 在這種情況下,你希望使優(yōu)化器屏蔽掉EMP_CLASS索引.

          用下面的方案就可以解決問(wèn)題.

          SELECT ENAME

          FROM EMP

          WHERE EMP_TYPE = ‘A’

          AND EMP_CLASS||’’ = ‘X’;

           

          32.       避免在索引列上使用計(jì)算.

          WHERE子句中,如果索引列是函數(shù)的一部分.優(yōu)化器將不使用索引而使用全表掃描.

           

          舉例:

           

          低效:

          SELECT …

          FROM DEPT

          WHERE SAL * 12 > 25000;

           

          高效:

          SELECT …

          FROM DEPT

          WHERE SAL  > 25000/12;

           

          譯者按:

          這是一個(gè)非常實(shí)用的規(guī)則,請(qǐng)務(wù)必牢記

           

          33.       自動(dòng)選擇索引

          如果表中有兩個(gè)以上(包括兩個(gè))索引,其中有一個(gè)唯一性索引,而其他是非唯一性.

          在這種情況下,ORACLE將使用唯一性索引而完全忽略非唯一性索引.

           

          舉例:

          SELECT ENAME

          FROM EMP

          WHERE EMPNO = 2326 

          AND DEPTNO  = 20 ;

           

          這里,只有EMPNO上的索引是唯一性的,所以EMPNO索引將用來(lái)檢索記錄.

          TABLE ACCESS BY ROWID ON EMP

                 INDEX UNIQUE SCAN ON EMP_NO_IDX

           

          34.       避免在索引列上使用NOT

          通常, 我們要避免在索引列上使用NOT, NOT會(huì)產(chǎn)生在和在索引列上使用函數(shù)相同的

          影響. 當(dāng)ORACLE”遇到”NOT,他就會(huì)停止使用索引轉(zhuǎn)而執(zhí)行全表掃描.

             舉例:

           

             低效: (這里,不使用索引)

           

             SELECT …

             FROM DEPT

             WHERE DEPT_CODE NOT = 0;

            

             高效: (這里,使用了索引)

           

            SELECT …

             FROM DEPT

             WHERE DEPT_CODE > 0;

           

             需要注意的是,在某些時(shí)候, ORACLE優(yōu)化器會(huì)自動(dòng)將NOT轉(zhuǎn)化成相對(duì)應(yīng)的關(guān)系操作符.

             NOT >  to  <=

             NOT >=  to  <

             NOT <  to  >=

             NOT <=  to  >

           

           

          譯者按:

               在這個(gè)例子中,作者犯了一些錯(cuò)誤. 例子中的低效率SQL是不能被執(zhí)行的.

          我做了一些測(cè)試:

              

          SQL> select * from emp where NOT empno > 1;

          no rows selected

          Execution Plan

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

             0      SELECT STATEMENT Optimizer=CHOOSE

             1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

             2    1     INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)    

           

          SQL> select * from emp where empno <= 1;

          no rows selected

          Execution Plan

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

             0      SELECT STATEMENT Optimizer=CHOOSE

             1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

             2    1     INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)

           

                兩者的效率完全一樣,也許這符合作者關(guān)于在某些時(shí)候, ORACLE優(yōu)化器會(huì)自動(dòng)將NOT轉(zhuǎn)化成相對(duì)應(yīng)的關(guān)系操作符的觀點(diǎn).

               

          35.       >=替代>

           

          如果DEPTNO上有一個(gè)索引,

           

          高效:

           

             SELECT *

             FROM EMP

             WHERE DEPTNO >=4

            

             低效:

           

             SELECT *

             FROM EMP

             WHERE DEPTNO >3

           

                兩者的區(qū)別在于, 前者DBMS將直接跳到第一個(gè)DEPT等于4的記錄而后者將首先定位到DEPTNO=3的記錄并且向前掃描到第一個(gè)DEPT大于3的記錄.


          主站蜘蛛池模板: 石屏县| 运城市| 曲周县| 张家口市| 钟祥市| 杭锦旗| 资源县| 平凉市| 连南| 蓬溪县| 江都市| 包头市| 东乌珠穆沁旗| 仪陇县| 丰镇市| 滨州市| 恭城| 闸北区| 潜江市| 镇平县| 香港| 达日县| 丰县| 泸西县| 两当县| 诸暨市| 防城港市| 嫩江县| 青阳县| 无为县| 怀宁县| 凌海市| 镇赉县| 文水县| 循化| 蓬莱市| 广灵县| 万源市| 吉水县| 闵行区| 宽甸|