oracle語句優化30個規則詳解_第1頁
oracle語句優化30個規則詳解_第2頁
oracle語句優化30個規則詳解_第3頁
oracle語句優化30個規則詳解_第4頁
oracle語句優化30個規則詳解_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1. 選用適合的Oracle優化器Oraclle的優化器器共有3種:a. RUULE (基基于規則)b. COOST (基基于成本)c. CHHOOSE (選擇性)設置缺省的的優化器,可可以通過對iinit.oora文件中中OPTIMMIZER_MODE參參數的各種聲聲明,如RUULE,COOST,CHHOOSE,AALL_ROOWS,FIIRST_RROWS . 你當然也也在SQL句句級或是會話話(sesssion)級級對其進行覆覆蓋。為了使用基基于成本的優優化器(CBBO, Coost-Baased OOptimiizer) , 你必須須經常運行aanalyzze 命令,以以增加數據庫庫中

2、的對象統統計信息(oobjectt stattisticcs)的準確確性。如果數據庫庫的優化器模模式設置為選選擇性(CHHOOSE),那么實際際的優化器模模式將和是否否運行過annalyzee命令有關。 如果taable已經經被anallyze過, 優化器模式式將自動成為為CBO , 反之,數據據庫將采用RRULE形式式的優化器。在缺省情況況下,ORAACLE采用用CHOOSSE優化器,為為了避免那些些不必要的全全表掃描(ffull ttable scan) , 你必必須盡量避免免使用CHOOOSE優化化器,而直接接采用基于規規則或者基于于成本的優化化器。2. 訪問問Tablee的方式Orra

3、cle 采用兩種訪訪問表中記錄錄的方式:a. 全表表掃描全表掃描就就是順序地訪訪問表中每條條記錄。 OORACLEE采用一次讀讀入多個數據據塊(dattabasee blocck)的方式式優化全表掃掃描。b. 通過過ROWIDD訪問表你可以采用用基于ROWWID的訪問問方式情況,提提高訪問表的的效率, RROWID包包含了表中記記錄的物理位位置信息ORACLLE采用索引引(INDEEX)實現了了數據和存放放數據的物理理位置(ROOWID)之之間的聯系。通常索引提提供了快速訪訪問ROWIID的方法,因因此那些基于于索引列的查查詢就可以得得到性能上的的提高。3. 共享享SQL語句句為了不重復復解析

4、相同的的SQL語句句,在第一次次解析之后, ORACLLE將SQLL語句存放在在內存中。這這塊位于系統統全局區域SSGA(syystem globaal areea)的共享享池(shaared bbufferr pooll)中的內存存可以被所有有的數據庫用用戶共享。 因此,當你你執行一個SSQL語句(有時被稱為為一個游標)時,如果它它和之前的執執行過的語句句完全相同, ORACLLE就能很快快獲得已經被被解析的語句句以及最好的的執行路可惜的是ORAACLE只對對簡單的表提提供高速緩沖沖(cachhe buffferinng) ,這這個功能并不不適用于多表表連接查詢。數據庫管理理員必須在iini

5、t.oora中為這這個區域設置置合適的參數數,當這個內內存區域越大大,就可以保保留更多的語語句,當然被被共享的可能能性也就越大大了。當你向ORRACLE 提交一個SSQL語句,OORACLEE會首先在這這塊內存中查查找相同的語語句。這里需要注注明的是,OORACLEE對兩者采取取的是一種嚴嚴格匹配,要要達成共享,SSQL語句必必須完全相同同(包括空格格,換行等)。共享的語句句必須滿足三三個條件:A. 字符符級的比較:當前被執行行的語句和共共享池中的語語句必須完全全相同。例如:SELECTT*FROMMEMP;和下列每一一個都不同SELEECT*frromEMPP;Seleect*FrromEm

6、pp;SELEECT*FRROMEMPP;B. 兩個個語句所指的的對象必須完完全相同:例如:用戶 對象象名 如何訪訪問 Jackksal_llimitpprivattesynoonymWoork_ciitypubblicsyynonymmPlantt_detaailpubblicsyynonymmJillssal_liimitprrivateesynonnymWork_ccitypuublicssynonyymPlannt_dettailtaableowwner考慮一下下下列SQL語語句能否在這這兩個用戶之之間共享。SQL 能能否共享 原原因selecct maxx(sal_cap) from

7、 sal_llimit; 不能 每每個用戶都有有一個priivate synonnym - sal_llimit , 它們是是不同的對象象selecct couunt(*00 fromm workk_cityy wherre sdeesc liike NNEW%; 能 兩個個用戶訪問相相同的對象ppublicc synoonym - workk_cityyselecct a.ssdesc,b.loccationn fromm workk_cityy a , plantt_detaail b wheree a.ciity_idd = b.city_id 不能能 用戶jaack 通過過privaa

8、te syynonymm訪問plaant_deetail 而jilll 是表的所所有者,對象象不同.C. 兩個SQQL語句中必必須使用相同同的名字的綁綁定變量(bbind vvariabbles)例如:第一一組的兩個SSQL語句是是相同的(可可以共享),而而第二組中的的兩個語句是是不同的(即即使在運行時時,賦于不同同的綁定變量量相同的值)a.selectppin,naamefroompeopplewheerepinn=:blkk1.pinn;seleectpinn,nameefromppeopleewhereepin=:blk1.pin;b.selectppin,naamefroompeopp

9、lewheerepinn=:blkk1.ot_ind;sselecttpin,nnamefrrompeooplewhherepiin=:bllk1.ovv_ind;4. 選擇擇最有效率的的表名順序(只在基于規規則的優化器器中有效)ORACLLE的解析器器按照從右到到左的順序處處理FROMM子句中的表表名,因此FFROM子句句中寫在最后后的表(基礎礎表 driiving tablee)將被最先先處理。 在在FROM子子句中包含多多個表的情況況下,你必須須選擇記錄條條數最少的表表作為基礎表表。當ORAACLE處理理多個表時,會會運用排序及及合并的方式式連接它們。首先,掃描描第一個表(FROM子子句

10、中最后的的那個表)并并對記錄進行行派序,然后后掃描第二個個表(FROOM子句中最最后第二個表表),最后將將所有從第二二個表中檢索索出的記錄與與第一個表中中合適記錄進進行合并。例如:表 TABB1 16,3384 條記記錄表 TABB2 1 條條記錄選擇TABB2作為基礎礎表 (最好好的方法)selectccount(*)froomtab11,tab22執行時間00.96秒選擇TABB2作為基礎礎表 (不佳佳的方法)selectccount(*)froomtab22,tab11執行時間226.09秒秒如果有3個個以上的表連連接查詢, 那就需要選選擇交叉表(interrsectiion taabl

11、e)作作為基礎表, 交叉表是指指那個被其他他表所引用的的表。例如: EEMP表描述述了LOCAATION表表和CATEEGORY表表的交集。SELECCT*FROOMLOCAATIONLL,CATEEGORYCC,EMPEEWHEREEE.EMPP_NOBEETWEENN1000AAND20000ANDEE.CAT_NO=C.CAT_NNOANDEE.LOCNN=L.LOOCN將比下列SQLL更有效率 SELEECT*FRROMEMPPE,LOCCATIONNL,CATTEGORYYCWHERREE.CAAT_NO=C.CATT_NOANNDE.LOOCN=L.LOCNAANDE.EEMP_N

12、OOBETWEEEN10000AND220005. WHHERE子句句中的連接順順序。ORACLLE采用自下下而上的順序序解析WHEERE子句,根根據這個原理理,表之間的的連接必須寫寫在其他WHHERE條件件之前, 那那些可以過濾濾掉最大數量量記錄的條件件必須寫在WWHERE子子句的末尾。例如:(低效,執執行時間1556.3秒)SELECCTFROOMEMPEEWHEREESAL550000AANDJOBB=MANNAGERAND255(SELLECTCOOUNT(*)FROMMEMPWHHEREMGGR=E.EEMPNO);(高效,執執行時間100.6秒)SELEECTFRROMEMPPEW

13、HERRE25500000ANNDJOB=MANAAGER;6. SEELECT子子句中避免使使用 * 當你想在SSELECTT子句中列出出所有的COOLUMN時時,使用動態態SQL列引引用 * 是一個方方便的方法。不幸的是,這這是一個非常常低效的方法法。實際上,OORACLEE在解析的過過程中, 會會將* 依次轉換成成所有的列名名, 這個工工作是通過查查詢數據字典典完成的, 這意味著將將耗費更多的的時間。7. 減少少訪問數據庫庫的次數當執行每條條SQL語句句時, ORRACLE在在內部執行了了許多工作: 解析SQQL語句, 估算索引的的利用率, 綁定變量 , 讀數據據塊等等。 由此可見, 減

14、少訪問數數據庫的次數數 , 就能能實際上減少少ORACLLE的工作量量。例如,以下下有三種方法法可以檢索出出雇員號等于于0342或或0291的的職員。方法1 (最低效)SELEECTEMPP_NAMEE,SALAARY,GRRADEFRROMEMPPWHEREEEMP_NNO=3422;SELEECTEMPP_NAMEE,SALAARY,GRRADEFRROMEMPPWHEREEEMP_NNO=2911;方法2 (次低低效)DECLAARECURRSORC11(E_NOONUMBEER)ISSSELECTTEMP_NNAME,SSALARYY,GRADDEFROMMEMPWHHEREEMMP_

15、NO=E_NO;BEGINNOPENCC1(3422);FETTCHC1IINTO,.,.;OPENNC1(2991);FEETCHC11INTO,.,.;CLOOSEC1; END;方法3 (高效)SELEECTA.EEMP_NAAME,A.SALARRY,A.GGRADE,B.EMPP_NAMEE,B.SAALARY,B.GRAADEFROOMEMPAA,EMPBBWHEREEA.EMPP_NO=3342ANDDB.EMPP_NO=2291;注意:在SQL*Plus , SQLL*Formms和Proo*C中重新新設置ARRRAYSIZZE參數, 可以增加每每次數據庫訪訪問的檢索數數據量

16、,建建議值為2000.8. 使用用DECODDE函數來減減少處理時間間使用DECCODE函數數可以避免重重復掃描相同同記錄或重復復連接相同的的表。例如: SELEECTCOUUNT(*),SUM(SAL)FFROMEEMPWHEEREDEPPT_NO=0020AANDENAAMELIKKESMMITH%;SELEECTCOUUNT(*),SUM(SAL)FFROMEEMPWHEEREDEPPT_NO=0030AANDENAAMELIKKESMMITH%;你可以用DDECODEE函數高效地地得到相同結結果SELECCTCOUNNT(DECCODE(DDEPT_NNO,00220,X,NULLL)

17、D00020_COOUNT,CCOUNT(DECODDE(DEPPT_NO,0030,X,NNULL)D00300_COUNNT,SUMM(DECOODE(DEEPT_NOO,00200,SAL,NULL)D00220_SALL,SUM(DECODDE(DEPPT_NO,0030,SAL,NNULL)D00300_SALFFROMEMMPWHERREENAMMELIKEESMITTH%;類似的,DDECODEE函數也可以以運用于GRROUP BBY 和ORRDER BBY子句中。9. 整合合簡單,無關關聯的數據庫庫訪問如果你有幾幾個簡單的數數據庫查詢語語句,你可以以把它們整合合到一個查詢詢中(

18、即使它它們之間沒有有關系)例如:SELEECTNAMMEFROMMEMPWHHEREEMMP_NO=1234;SELECCTNAMEEFROMDDPTWHEEREDPTT_NO=110;SELLECTNAAMEFROOMCATWWHERECCAT_TYYPE=RRD;上面的3個個查詢可以被被合并成一個個: SELEECTE.NNAME,DD.NAMEE,C.NAAMEFROOMCATCC,DPTDD,EMPEE,DUALLXWHERRENVL(X,XX.DUMMMY)=NVVL(X,E.ROOWID(+)ANDDNVL(X,X.DUMMYY)=NVLL(X,D.ROWWID(+)ANDNNVL

19、(XX,X.DDUMMY)=NVL(X,CC.ROWIID(+)ANDE.EMP_NNO(+)=1234AANDD.DDEPT_NNO(+)=10ANDDC.CATT_TYPEE(+)=RD;10. 刪刪除重復記錄錄最高效的刪刪除重復記錄錄方法 ( 因為使用了了ROWIDD) DELEETEFROOMEMPEEWHEREEE.ROWWID(SSELECTTMIN(XX.ROWIID)FROOMEMPXXWHEREEX.EMPP_NO=EE.EMP_NO);11. 用用TRUNCCATE替代代DELETTE當刪除表中中的記錄時,在在通常情況下下, 回滾段段(rolllback segmeents

20、 ) 用來存放放可以被恢復復的信息。 如果你沒有有COMMIIT事務,OORACLEE會將數據恢恢復到刪除之之前的狀態(準確地說是是恢復到執行行刪除命令之之前的狀況)而當運用TTRUNCAATE時, 回滾段不再再存放任何可可被恢復的信信息。當命令令運行后,數數據不能被恢恢復。因此很很少的資源被被調用,執行行時間也會很很短。(譯者按: TRUNNCATE只只在刪除全表表適用,TRRUNCATTE是DDLL不是DMLL)12. 盡盡量多使用CCOMMITT只要有可能能,在程序中中盡量多使用用COMMIIT, 這樣樣程序的性能能得到提高,需需求也會因為為COMMIIT所釋放的的資源而減少少:COMM

21、MIT所釋放放的資源:a. 回滾滾段上用于恢恢復數據的信信息。b. 被程序語語句獲得的鎖鎖c. reedo loog bufffer 中中的空間d. ORRACLE為為管理上述33種資源中的的內部花費(譯者按: 在使用CCOMMITT時必須要注注意到事務的的完整性,現現實中效率和和事務完整性性往往是魚和和熊掌不可得得兼)13. 計計算記錄條數數和一般的觀觀點相反, countt(*) 比比countt(1)稍快快 , 當然然如果可以通通過索引檢索索,對索引列列的計數仍舊舊是最快的。 例如 CCOUNT(EMPNOO)(譯者按: 在CSDDN論壇中,曾曾經對此有過過相當熱烈的的討論, 作作者的觀

22、點并并不十分準確確,通過實際際的測試,上上述三種方法法并沒有顯著著的性能差別別)14. 用用Wheree子句替換HHAVINGG子句避免使用HHAVINGG子句, HHAVINGG 只會在檢檢索出所有記記錄之后才對對結果集進行行過濾。 這這個處理需要要排序,總計計等操作。 如果能通過過WHEREE子句限制記記錄的數目,那那就能減少這這方面的開銷銷。例如:低效:SELECCTREGIION,AVVG(LOGG_SIZEE)FROMMLOCATTIONGRROUPBYYREGIOONHAVIINGREGGIONREEGION!=SYDDNEYANDREEGION!=PERRTH高效:SELEECT

23、REGGION,AAVG(LOOG_SIZZE)FROOMLOCAATIONWWHERERREGIONNREGIOON!=SSYDNEYYANDRREGIONN!=PEERTHGGROUPBBYREGIION15. 減減少對表的查查詢在含有子查查詢的SQLL語句中,要要特別注意減減少對表的查查詢。例如:低效SELEECTTABB_NAMEEFROMTTABLESSWHEREETAB_NNAME=(SELECCTTAB_NAMEFFROMTAAB_COLLUMNSWHHEREVEERSIONN=604)ANDDDB_VERR=(SELLECTDBB_VERFFROMTAAB_COLLUMNSWW

24、HEREVVERSIOON=6044)高效SELEECTTABB_NAMEEFROMTTABLESSWHEREE(TAB_NAME,DB_VEER)=(SSELECTTTAB_NNAME,DDB_VERR)FROMMTAB_CCOLUMNNSWHERREVERSSION=6604)Uppdate多多個Coluumn例子:低效:UPDAATEEMPPSETEMMP_CATT=(SELLECTMAAX(CATTEGORYY)FROMMEMP_CCATEGOORIES),SAL_RANGEE=(SELLECTMAAX(SALL_RANGGE)FROOMEMP_CATEGGORIESS)WHERREE

25、MP_DEPT=0020;高效: UPDAATEEMPPSET(EEMP_CAAT,SALL_RANGGE)=(SSELECTTMAX(CCATEGOORY),MMAX(SAAL_RANNGE)FRROMEMPP_CATEEGORIEES)WHEEREEMPP_DEPTT=00200;16. 通通過內部函數數提高SQLL效率。SELEECTH.EEMPNO,E.ENAAME,H.HIST_TYPE,T.TYPPE_DESSC,COUUNT(*)FROMHHISTORRY_TYPPET,EMMPE,EMMP_HISSTORYHHWHEREEH.EMPPNO=E.EMPNOOANDH.HIST_T

26、YPE=T.HISST_TYPPEGROUUPBYH.EMPNOO,E.ENNAME,HH.HISTT_TYPEE,T.TYYPE_DEESC;通過調用下下面的函數可可以提高效率率。FUNCCTIONLLOOKUPP_HISTT_TYPEE(TYPIINNUMBBER)REETURNVVARCHAAR2ASTDESSCVARCCHAR2(30);CCURSORRC1ISSSELECTTTYPE_DESCFFROMHIISTORYY_TYPEEWHEREEHIST_TYPE=TYP;BBEGINOOPENC11;FETCCHC1INNTOTDEESC;CLLOSEC11;RETUURN(NVVL

27、(TDEESC,?);EEND;FUUNCTIOONLOOKKUP_EMMP(EMPPINNUMMBER)RRETURNNVARCHHAR2ASSENAMEEVARCHHAR2(330);CUURSORCC1ISSEELECTEENAMEFFROMEMMPWHERREEMPNNO=EMPP;BEGIINOPENNC1;FEETCHC11INTOEENAME;CLOSEEC1;REETURN(NVL(EENAME,?);END;SELECCTH.EMMPNO,LLOOKUPP_EMP(H.EMPPNO),HH.HISTT_TYPEE,LOOKKUP_HIIST_TYYPE(H.HIST_TYPE

28、),COUNNT(*)FFROMEMMP_HISSTORYHHGROUPPBYH.EEMPNO,H.HISST_TYPPE;(譯者按: 經常在論論壇中看到如如 能不能能用一個SQQL寫出。 的貼子子, 殊不知知復雜的SQQL往往犧牲牲了執行效率率。 能夠掌掌握上面的運運用函數解決決問題的方法法在實際工作作中是非常有有意義的)低效:UPDAATEEMPPSETEMMP_CATT=(SELLECTMAAX(CATTEGORYY)FROMMEMP_CCATEGOORIES),SAL_RANGEE=(SELLECTMAAX(SALL_RANGGE)FROOMEMP_CATEGGORIESS)WHERR

29、EEMP_DEPT=0020;高效: UPDAATEEMPPSET(EEMP_CAAT,SALL_RANGGE)=(SSELECTTMAX(CCATEGOORY),MMAX(SAAL_RANNGE)FRROMEMPP_CATEEGORIEES)WHEEREEMPP_DEPTT=00200;16. 通通過內部函數數提高SQLL效率。SELEECTH.EEMPNO,E.ENAAME,H.HIST_TYPE,T.TYPPE_DESSC,COUUNT(*)FROMHHISTORRY_TYPPET,EMMPE,EMMP_HISSTORYHHWHEREEH.EMPPNO=E.EMPNOOANDH.HIST

30、_TYPE=T.HISST_TYPPEGROUUPBYH.EMPNOO,E.ENNAME,HH.HISTT_TYPEE,T.TYYPE_DEESC;通過調用下下面的函數可可以提高效率率。FUNCCTIONLLOOKUPP_HISTT_TYPEE(TYPIINNUMBBER)REETURNVVARCHAAR2ASTDESSCVARCCHAR2(30);CCURSORRC1ISSSELECTTTYPE_DESCFFROMHIISTORYY_TYPEEWHEREEHIST_TYPE=TYP;BBEGINOOPENC11;FETCCHC1INNTOTDEESC;CLLOSEC11;RETUURN(NV

31、VL(TDEESC,?);EEND;FUUNCTIOONLOOKKUP_EMMP(EMPPINNUMMBER)RRETURNNVARCHHAR2ASSENAMEEVARCHHAR2(330);CUURSORCC1ISSEELECTEENAMEFFROMEMMPWHERREEMPNNO=EMPP;BEGIINOPENNC1;FEETCHC11INTOEENAME;CLOSEEC1;REETURN(NVL(EENAME,?);END;SELECCTH.EMMPNO,LLOOKUPP_EMP(H.EMPPNO),HH.HISTT_TYPEE,LOOKKUP_HIIST_TYYPE(H.HIST_TY

32、PE),COUNNT(*)FFROMEMMP_HISSTORYHHGROUPPBYH.EEMPNO,H.HISST_TYPPE;(譯者按: 經常在論論壇中看到如如 能不能能用一個SQQL寫出。 的貼子子, 殊不知知復雜的SQQL往往犧牲牲了執行效率率。 能夠掌掌握上面的運運用函數解決決問題的方法法在實際工作作中是非常有有意義的)(方法二: 最最高效)SELEECT.FFROMEMMPEWHEERENOTTEXISTTS(SELLECTXXFROMMDEPTDDWHEREED.DEPPT_NO=E.DEPPT_NOAANDDEPPT_CATT=A);20. 用用表連接替換換EXISTTS通常來說

33、 , 采用表表連接的方式式比EXISSTS更有效效率SELECCTENAMMEFROMMEMPEWWHEREEEXISTSS(SELEECTXFROMDDEPTWHHEREDEEPT_NOO=E.DEEPT_NOOANDDEEPT_CAAT=A);(更高效)SELEECTENAAMEFROOMDEPTTD,EMPPEWHERREE.DEEPT_NOO=D.DEEPT_NOOANDDEEPT_CAAT=A;(譯者按: 在RBOO的情況下,前前者的執行路路徑包括FIILTER,后后者使用NEESTED LOOP)21. 用用EXISTTS替換DIISTINCCT當提交一個個包含一對多多表信息(比比

34、如部門表和和雇員表)的的查詢時,避避免在SELLECT子句句中使用DIISTINCCT. 一般般可以考慮用用EXISTT替換例如:低效: SELEECTDISSTINCTTDEPT_NO,DEEPT_NAAMEFROOMDEPTTD,EMPPEWHERRED.DEEPT_NOO=E.DEEPT_NOO高效:SELECCTDEPTT_NO,DDEPT_NNAMEFRROMDEPPTDWHEEREEXIISTS(SSELECTTXFRROMEMPPEWHERREE.DEEPT_NOO=D.DEEPT_NOO);EXISTTS 使查詢詢更為迅速,因因為RDBMMS核心模塊塊將在子查詢詢的條件一旦旦滿

35、足后,立立刻返回結果果。22. 識識別低效執執行的SQQL語句用下列SQQL工具找出出低效SQLL:SELECCTEXECCUTIONNS,DISSK_REAADS,BUUFFER_GETS,ROUNDD(BUFFFER_GGETS-DDISK_RREADS)/BUFFFER_GEETS,2)Hit_rradio,ROUNDD(DISKK_READDS/EXEECUTIOONS,2)Readss_per_run,SSQL_TEEXTFROOMV$SQQLAREAAWHEREEEXECUUTIONSS0ANDDBUFFEER_GETTS0ANND(BUFFFER_GGETS-DDISK_RREA

36、DS)/BUFFFER_GEETSllist1SSELECTT*2FROOMdeptt,emp33*WHERREemp.deptnno=deppt.depptnoSQQLsettautottracettraceoonly/*traceeonly可可以不顯示執執行結果*/SQL/14rowwsseleected.ExecuutionPPlan-0SELLECTSTTATEMEENTptiimizerr=CHOOOSE10NNESTEDDLOOPSS21TABBLEACCCESS(FFULL)OOFEMPP31TAABLEACCCESS(BYINDDEXROWWID)OFFDEPTT43INNDE

37、X(UUNIQUEESCAN)OFPKK_DEPTT(UNIIQUE)SStatisstics-0reecursiivecallls2dbbblockkgets330conssistenntgetss0physsicalrreads00redossize25598byttessenntviaSSQL*Neettocllient5503byttesrecceiveddviaSQQL*Nettfromcclientt2SQL*Netrooundtrripstoo/frommcliennt0sorrts(meemory)0sortts(dissk)14rrowsprrocesssed通過以上分分析,

38、可以得得出實際的執執行步驟是: 1.TAABLEACCCESS(FULL)OFEMMP2.IINDEX(UNIQUUESCANN)OFPPK_DEPPT(UNNIQUE)3.TABBLEACCCESS(BBYINDEEXROWIID)OFDEPT4.NESSTEDLOOOPS(JJOININNG1ANDD3)注: 目前前許多第三方方的工具如TTOAD和OORACLEE本身提供的的工具如OMMS的SQLL Anallyze都提提供了極其方方便的EXPPLAIN PLAN工工具。也許喜喜歡圖形化界界面的朋友們們可以選用它它們。25. 用用索引提高效效率索引是表的的一個概念部部分,用來提提高檢索數據

39、據的效率。 實際上,OORACLEE使用了一個個復雜的自平平衡B-trree結構。通常,通過過索引查詢數數據比全表掃掃描要快。 當ORACCLE找出執執行查詢和UUpdatee語句的最佳佳路徑時, ORACLLE優化器將將使用索引。同樣在聯結結多個表時使使用索引也可可以提高效率率。 另一個個使用索引的的好處是,它它提供了主鍵鍵(primmary kkey)的唯唯一性驗證。踐, 感到還是是用SQLPPLUS中的的SET TTRACE 功能比較方方便。除了那些LONNG或LONNG RAWW數據類型, 你可以索引引幾乎所有的的列。 通常常, 在大型型表中使用索索引特別有效效。 當然,你你也會發現,

40、 在掃描小表表時,使用索索引同樣能提提高效率。雖然使用索索引能得到查查詢效率的提提高,但是我我們也必須注注意到它的代代價。 索引引需要空間來來存儲,也需需要定期維護護,每當有記記錄在表中增增減或索引列列被修改時, 索引本身也也會被修改。 這意味著著每條記錄的的INSERRT , DDELETEE , UPPDATE將將為此多付出出4 , 55 次的磁盤盤I/O . 因為索引引需要額外的的存儲空間和和處理,那些些不必要的索索引反而會使使查詢反應時時間變慢。譯者按:定定期的重構索索引是有必要要的。ALTERR INDEEX REBBUILD26. 索索引的操作ORACLLE對索引有有兩種訪問模模式

41、。索引唯一掃掃描 ( IINDEX UNIQUUE SCAAN)大多數情況況下, 優化化器通過WHHERE子句句訪問INDDEX.例如:表LODGGING有兩兩個索引 : 建立在LLODGINNG列上的唯唯一性索引LLODGINNG_PK和和建立在MAANAGERR列上的非唯唯一性索引LLODGINNG$MANNAGER.SELEECT*FRROMLODDGINGWWHERELLODGINNG=ROOSEHILLL;在內部 , 上述SQLL將被分成兩兩步執行, 首先 , LODGIING_PKK 索引將通通過索引唯一一掃描的方式式被訪問 , 獲得相對應應的ROWIID, 通過過ROWIDD訪問

42、表的方方式執行下一一步檢索。如果被檢索索返回的列包包括在INDDEX列中,OORACLEE將不執行第第二步的處理理(通過ROOWID訪問問表)。 因因為檢索數據據保存在索引引中, 單單單訪問索引就就可以完全滿滿足查詢結果果。下面SQLL只需要INNDEX UUNIQUEE SCANN 操作。SELECCTLODGGINGFRROMLODDGINGWWHERELLODGINNG=ROOSEHILLL;索引范圍查查詢(INDDEX RAANGE SSCAN)適用于兩種種情況:1. 基于一個個范圍的檢索索2. 基于于非唯一性索索引的檢索例1:SELECCTLODGGINGFRROMLODDGINGW

43、WHERELLODGINNGLIKEEM%;WHEREE子句條件包包括一系列值值, ORAACLE將通通過索引范圍圍查詢的方式式查詢LODDGING_PK . 由于索引范范圍查詢將返返回一組值, 它的效率就就要比索引唯唯一掃描低一一些。例2: SELEECTLODDGINGFFROMLOODGINGGWHEREEMANAGGER=BBILLGAATES;這個SQLL的執行分兩兩步, LOODGINGG$MANAAGER的索索引范圍查詢詢(得到所有有符合條件記記錄的ROWWID)和下下一步同過RROWID訪訪問表得到LLODGINNG列的值。 由于LOODGINGG$MANAAGER是一一個非唯

44、一性性的索引,數數據庫不能對對它執行索引引唯一掃描。由于SQLL返回LODDGING列列,而它并不不存在于LOODGINGG$MANAAGER索引引中, 所以以在索引范圍圍查詢后會執執行一個通過過ROWIDD訪問表的操操作。WHEREE子句中, 如果索引列列所對應的值值的第一個字字符由通配符符(WILDDCARD)開始, 索索引將不被采采用。在這種種情況下,OORACLEE將使用全表表掃描。 SELEECTLODDGINGFFROMLOODGINGGWHEREEMANAGGERLIKKE%HAANMAN;27. 基基礎表的選擇擇基礎表(DDrivinng Tabble)是指指被最先訪問問的表(

45、通常常以全表掃描描的方式被訪訪問)。 根根據優化器的的不同, SSQL語句中中基礎表的選選擇是不一樣樣的。如果你使用用的是CBOO (COSST BASSED OPPTIMIZZER),優優化器會檢查查SQL語句句中的每個表表的物理大小小,索引的狀狀態,然后選選用花費最低低的執行路徑徑。如果你用RRBO (RRULE BBASED OPTIMMIZER) , 并且且所有的連接接條件都有索索引對應, 在這種情況況下, 基礎礎表就是FRROM 子句句中列在最后后的那個表。blog舉例:SELECCTA.NAAME,B.MANAGGERFROOMWORRKERA,LODGINGBWHEREA.LODGING=B.LODING;由于LODGIING表的LLODINGG列上有一個個索引, 而而且WORKKER表中沒沒有相比較的的索引, WWORKERR表將被作為為查詢中的基基礎表。28. 多多個平等的索索引當SQL語語句的執行路路徑可以使用用分布在多個個表上的多

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論