O管理ORACLESL性能優(yōu)化內(nèi)部培訓(xùn)資料_第1頁
O管理ORACLESL性能優(yōu)化內(nèi)部培訓(xùn)資料_第2頁
O管理ORACLESL性能優(yōu)化內(nèi)部培訓(xùn)資料_第3頁
O管理ORACLESL性能優(yōu)化內(nèi)部培訓(xùn)資料_第4頁
O管理ORACLESL性能優(yōu)化內(nèi)部培訓(xùn)資料_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、您可自由編輯】(O 管理)ORACLESL 性 能優(yōu)化(內(nèi)部培訓(xùn)資料)2020年5月多年的企業(yè)咨詢顏問經(jīng)駙rORACLESQL性能優(yōu)化系列(一).選用適合的ORACLE優(yōu)化器ORACLE的優(yōu)化器共有3種:a.RULE(基于規(guī)則)b.COST(基于成本)c.CHOOSE(選擇性)設(shè)置缺省的優(yōu)化器,可以通過對 init.ora 文件中OPTIMIZER_MODE 參數(shù)的各種聲明,如 RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS.你當(dāng)然也在 SQL 句級或是會話(session) 級對其進(jìn)行覆蓋.為了使用基于成本的優(yōu)化器 (CBO,Cost-BasedOptimizer)

2、,你必須經(jīng)常運(yùn)行 analyze命令,以增加數(shù)據(jù)庫中的對象統(tǒng)計(jì)信息(objectstatistics) 的準(zhǔn)確性.如果數(shù)據(jù)庫的優(yōu)化器模式設(shè)置為選擇性(CHOOSE),那么實(shí)際的優(yōu)化器模式將和是否運(yùn)行過analyze命令有關(guān).如果table已經(jīng)被analyze過,優(yōu)化器模式將自動成為CBO,反之,數(shù)據(jù)庫將采用RULE形式的優(yōu)化器.在缺省情況下,ORACLE采用CHOOSE 優(yōu)化器,為了避免那些不必要的全表掃描 (fulltablescan),你必須盡量避免使用CHOOSE優(yōu)化器,而直接采用基于規(guī)則或者基于成本的優(yōu)化器.訪問Table的方式ORACLE采用兩種訪問表中記錄的方式 :a.全表掃描全表

3、掃描就是順序地訪問表中每條記錄.ORACLE采用一次讀入多個數(shù)據(jù)塊 (databaseblock)的方式優(yōu)化全表掃描.b.通過ROWID訪問表你可以采用基于 ROWID的訪問方式情況,提高訪問表的效率,ROWID包含了表中記錄的物 理位置信息.ORACLE采用索引(INDEX)實(shí)現(xiàn)了數(shù)據(jù)和存放數(shù)據(jù)的物理位置(ROWID)之間的聯(lián)系.通常索引提供了快速訪問ROWID的方法,因此那些基于索引列的查詢就可以得到性能上的提高.共享SQL語句為了不重復(fù)解析相同的SQL語句,在第一次解析之后,ORACLE將SQL語句存放在內(nèi)存中.這塊位于系統(tǒng)全局區(qū)域SGA(systemglobalarea)的共享池(sh

4、aredbufferpool)中的內(nèi)存可以被所有的數(shù)據(jù)庫用戶共享.因此,當(dāng)你執(zhí)行一個SQL語句(有時被稱為一個游標(biāo))時,如果它和之前的執(zhí)行過的語句完全相同,ORACLE就能很快獲得已經(jīng)被解析的語句以及最好的執(zhí)行路徑QRACLE的這個功能大大地提高了SQL的執(zhí)行性能并節(jié)省了內(nèi)存的使用.可惜的是ORACLE只對簡單的表提供高速緩沖 (cachebuffering), 這個功能并不適用于多表連接查詢 TOC o 1-5 h z 數(shù)據(jù)庫管理員必須在 init.ora中為這個區(qū)域設(shè)置合適的參數(shù),當(dāng)這個內(nèi)存區(qū)域越大,就可以保 留更多的語句,當(dāng)然被共享的可能性也就越大了.當(dāng)你向ORACLE提交一個SQL語句

5、,ORACLE會首先在這塊內(nèi)存中查找相同的語句.這里需要注明的是,ORACLE對兩者采取的是一種嚴(yán)格匹配,要達(dá)成共享,SQL語句必須完全 相同(包括空格,換行等).共享的語句必須滿足三個條件:A.字符級的比較:當(dāng)前被執(zhí)行的語句和共享池中的語句必須完全相同例如:SELECT*FROMEMP;和下列每一個都不同SELECT*fromEMP;Select*FromEmp;SELECT*FROMEMP;B.兩個語句所指的對象必須完全相同例如:用戶對象名如何訪問Jacksal_limitprivatesynonymWork_citypublicsynonymPlant_detailpublicsynon

6、ymJillsal_limitprivatesynonymWork_citypublicsynonymPlantdetailtableowner考慮一下下列SQL語句能否在這兩個用戶之間共享.SQL能否共享/原因selectmax(sal_cap)fromsal_limit;不能每個用戶都有一個privatesynonym-sal_limit, 它們是不同的對象selectcount(*0fromwork_citywheresdesclikeNEW%;臺匕目匕兩個用戶訪問相同的對象publicsynonym-work_cityselecta.sdesc,b.locationfromwork_c

7、itya,plant_detailbwherea.city_id=b.city_id不能用戶jack通過privatesynonym 訪問plant_detail 而jill是表的所有者,對象不同C.兩個SQL語句中必須使用相同的名字的綁定變量(bindvariables)例如:第一組的兩個SQL語句是相同的(可以共享工而第二組中的兩個語句是不同的(即使在運(yùn)行時 賦于不同的綁定變量相同的值)a.selectpin,namefrompeoplewherepin=:blk1.pin;selectpin,namefrompeoplewherepin=:blk1.pin; b.selectpin,na

8、mefrompeoplewherepin=:blk1.ot_ind;selectpin,namefrompeoplewherepin=:blk1.ov_ind;.選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效)ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最后的表(基礎(chǔ)表drivingtable) 將被最先處理.在FROM子句中包含多個表的情況下,你必須選擇記錄條數(shù)最少白表作為基礎(chǔ)表.當(dāng)ORACLE處理多個表時,會運(yùn)用排序及合并的方式連 接它們.首先,掃描第一個表(FROM子句中最后的那個表)并對記錄進(jìn)行派序,然后掃描第二個 表(FROM子句中最后第

9、二個表,最后將所有從第二個表中檢索出的記錄與第一個表中合適 記錄進(jìn)行合并.例如:表TAB116,384條記錄表TAB21條記錄選才i TAB2作為基礎(chǔ)表(最好的方法)selectcount(*)fromtab1,tab2執(zhí)行時間 0.96 秒選才i TAB2作為基礎(chǔ)表(不佳的方法)selectcount(*)fromtab2,tab1執(zhí)行時間 26.09 秒如果有3個以上的表連接查詢,那就需要選擇交叉表(intersectiontable) 作為基礎(chǔ)表,交叉表 是指那個被其他表所引用的表.例如:EMP表描述了 LOCATION 表和CATEGORY表的交集.SELECT*FROMLOCATIO

10、NL,CATEGORYC,EMPEWHEREE.EMP_NOBETWEEN1000AND2000ANDE.CAT_NO=C.CAT_NOANDE.LOCN=L.LOCN將比下列SQL更有效率SELECT*FROMEMPE,LOCATIONL,CATEGORYCWHEREE.CAT_NO=C.CAT_NOANDE.LOCN=L.LOCNANDE.EMP_NOBETWEEN1000AND2000.WHERE子句中的連接順序.,表之間的連接必須寫在其他WHERE子句的末尾.ORACLE采用自下而上的順序解析WHERE子句,根據(jù)這個原理WHERE條件之前,那些可以過濾掉最大數(shù)量記錄的條件必須寫在例如:

11、(低效,執(zhí)行時間156.3秒)SELECT FROMEMPEWHERESAL50000ANDJOB= MANAGERAND25(SELECTCOUNT(*)FROMEMPWHEREMGR=E.EMPNO);(高效,執(zhí)行時間10.6秒)SELECT FROMEMPEWHERE2550000ANDJ OB= MANAGER;6.SELECT子句中避免使用當(dāng)你想在SELECT子句中列出所有的 COLUMN 時,使用動態(tài)SQL列引用*是一個方便的 方法.不幸的是,這是一個非常低效的方法.實(shí)際上,ORACLE在解析的過程中,會將*依次轉(zhuǎn) 換成所有的列名,這個工作是通過查詢數(shù)據(jù)字典完成的 ,這意味著將耗費(fèi)

12、更多的時間.減少訪問數(shù)據(jù)庫的次數(shù)當(dāng)執(zhí)行每條SQL語句時,ORACLE在內(nèi)部執(zhí)行了許多工作:解析SQL語句,估算索引的利用率 綁定變量讀數(shù)據(jù)塊等等.由此可見,減少訪問數(shù)據(jù)庫的次數(shù),就能實(shí)際上減少 ORACLE的工作 量.例如,以下有三種方法可以檢索出雇員號等于0342或0291的職員.方法1(最低效)SELECTEMP_NAME,SALARY,GRADEFROMEMPWHEREEMP_NO=342;SELECTEMP_NAME,SALARY,GRADEFROMEMPWHEREEMP_NO=291;方法2(次低效)DECLARECURSORC1(E_NONUMBER)ISSELECTEMP_NAM

13、E,SALARY,GRADEFROMEMPWHEREEMP_NO=E_NO;BEGINOPENC1(342);FETCHC1INTOOPENC1(291);FETCHC1INTOCLOSEC1;END;方法3(高效)SELECTA.EMP_NAME,A.SALARY,A.GRADE,B.EMP_NAME,B.SALARY,B.GRADEFROMEMPA,EMPBWHEREA.EMP_NO=342ANDB.EMP_NO=291;注意:在SQL*Plus,SQL*Forms 和Pro*C中重新設(shè)置 ARRAYSIZE參數(shù),可以增加每次數(shù)據(jù)庫訪問 的檢索數(shù)據(jù)量,建議彳1為200ORACLESQL性能

14、優(yōu)化系列(三).使用DECODE函數(shù)來減少處理時間使用DECODE函數(shù)可以避免重復(fù)掃描相同記錄或重復(fù)連接相同的表例如:SELECTCOUNT(*) , SUM(SAL)FROMEMPWHEREDEPT_NO=0020ANDENAMELIKE SMITH%SELECTCOUNT(*) , SUM(SAL)FROMEMPWHEREDEPT_NO=0030ANDENAMELIKE SMITH%你可以用DECODE函數(shù)高效地得到相同結(jié)果SELECTCOUNT(DECODE(DEPT_NO,0020, X ,NULL)D0020_COUNT,COUNT(DECODE(DEPT_NO,0030, X ,N

15、ULL)D0030_COUNT,SUM(DECODE(DEPT_NO,0020,SAL,NULL)D0020_SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL)D0030_SALFROMEMPWHEREENAMELIKE SMITH%類似的,DECODE函數(shù)也可以運(yùn)用于 GROUPBY和ORDERBY子句中.整合簡單,無關(guān)聯(lián)的數(shù)據(jù)庫訪問如果你有幾個簡單的數(shù)據(jù)庫查詢語句,你可以把它們整合到一個查詢中(即使它們之間沒有關(guān)系)例如:SELECTNAMEFROMEMPWHEREEMP_NO=1234;SELECTNAMEFROMDPTWHEREDPT_NO=10;SELECTN

16、AMEFROMCATWHERECAT_TYPE= RD;上面的3個查詢可以被合并成一個SELECTE.NAME,D.NAME,C.NAMEFROMCATC,DPTD,EMPE,DUALXWHERENVL( X ,X.DUMMY)=NVL(X ,E.ROWID(+)ANDNVL( X ,X.DUMMY)=NVL( X,D.ROWID(+)ANDNVL( X ,X.DUMMY)=NVL( X,C.ROWID(+)ANDE.EMP_NO(+)=1234ANDD.DEPT_NO(+)=10ANDC.CAT_TYP E(+)= RD;(譯者按:雖然采取這種方法,效率得到提高,但是程序的可讀性大大降低,所

17、以讀者還是要權(quán)衡之間的利弊).刪除重復(fù)記錄最高效的刪除重復(fù)記錄方法(因?yàn)槭褂昧?ROWID)DELETEFROMEMPEWHEREE.ROWID(SELECTMIN(X.ROWID)FROMEMPXWHEREX.EMP_NO=E.EMP_NO);.盡量多使用COMMIT只要有可能,在程序中盡量多使用COMMIT,這樣程序的性能得到提高,需求也會因?yàn)镃OMMIT 所釋放的資源而減少:COMMIT所釋放的資源a.回滾段上用于恢復(fù)數(shù)據(jù)的信息 b.被程序語句獲得的鎖c.redologbuffer 中的空間d.ORACLE為管理上述3種資源中的內(nèi)部花費(fèi)(譯者按:在使用COMMIT時必須要注意到事務(wù)的完整

18、性,現(xiàn)實(shí)中效率和事務(wù)完整性往往是魚和熊掌不可得兼)ORACLESQL性能優(yōu)化系列(四).計(jì)算記錄條數(shù)和一般的觀點(diǎn)相反,count(*)比count(1)稍快,當(dāng)然如果可以通過索引檢索,對索引列的計(jì)數(shù)仍舊是最快的.例如COUNT(EMPNO)(譯者按:在CSDN論壇中,曾經(jīng)對此有過相當(dāng)熱烈的討論,作者的觀點(diǎn)并不十分準(zhǔn)確,通過實(shí)際的測試,上述三種方法并沒有顯著的性能差別).用Where 子句替換HAVING 子句避免使用HAVING子句,HAVING只會在檢索出所有記錄之后才對結(jié)果集進(jìn)行過濾.這個處理需要排序,總計(jì)等操作.如果能通過 WHERE子句限制記錄的數(shù)目,那就能減少這方面的開銷.例如:低效

19、:SELECTREGION , AVG(LOG_SIZE)FROMLOCATIONGROUPBYREGIONHAVINGREGIONRE GION!= SYDNEYANDREGION!= PERTH高效SELECTREGION , AVG(LOG_SIZE)FROMLOCATIONWHEREREGIONREGION!= SYDNEYANDREGION!= PERTHGROUPBYREGION(譯者按:HAVING 中的條件一般用于對一些集合函數(shù)的比較,如COUNT()等等.除此而外,般的條件應(yīng)該寫在 WHERE子句中).減少對表的查詢在含有子查詢的 SQL語句中,要特別注意減少對表的查詢 .例

20、如:低效SELECTTAB_NAMEFROMTABLESWHERETAB_NAME=(SELECTTAB_NAMEFROMTAB_COLUMNSWHEREVERSION=604)ANDDB_VER=(SELECTDB_VERFROMTAB_COLUMNSWHEREVERSION=604)高效SELECTTAB_NAMEFROMTABLESWHERE(TAB_NAME,DB_VER)=(SELECTTAB_NAME,DB_VER)FROMTAB_COLUMNSWHEREVERSION=604)Update 多個 Column 例子:UPDATEEMPSETEMP_CAT=(SELECTMAX(C

21、ATEGORY)FROMEMP_CATEGORIES),SAL_RANGE=(SELECTMAX(SAL_RANGE)FROMEMP_CATEGORIES)WHEREEMP_DEPT=0020;UPDATEEMPSET(EMP_CAT,SAL_RANGE)=(SELECTMAX(CATEGORY),MAX(SAL_RANGE)FROMEMP_CATEGORIES)WHEREEMP_DEPT=0020;.通過內(nèi)部函數(shù)提高 SQL效率.SELECTH.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)FROMHISTORY_TYPET,EMPE,EMP_H

22、ISTORYHWHEREH.EMPNO=E.EMPNOANDH.HIST_TYPE=T.HIST_TYPEGROUPBYH.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;通過調(diào)用下面的函數(shù)可以提高效率FUNCTIONLOOKUP_HIST_TYPE(TYPINNUMBER)RETURNVARCHAR2ASTDESCVARCHAR2(30);CURSORC1ISSELECTTYPE_DESCFROMHISTORY_TYPEWHEREHIST_TYPE=TYP;BEGINOPENC1;FETCHC1INTOTDESC;CLOSEC1;RETURN(NVL(TDESC,

23、);END;FUNCTIONLOOKUP_EMP(EMPINNUMBER)RETURNVARCHAR2ASENAMEVARCHAR2(30);CURSORC1ISSELECTENAMEFROMEMPWHEREEMPNO=EMP;BEGINOPENC1;FETCHC1INTOENAME;CLOSEC1;RETURN(NVL(ENAME, ?);END;SELECTH.EMPNO,LOOKUP_EMP(H.EMPNO),H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)FROMEMP_HISTORYHGROUPBYH.EMPNO,H.HIST_TY

24、PE;ORACLESQL性能優(yōu)化系歹U (六).用表連接替換 EXISTS通常來說,采用表連接的方式比 EXISTS更有效率SELECTENAMEFROMEMPEWHEREEXISTS(SELECT XFROMDEPTWHEREDEPT_NO=E.DEPT_NOANDDEPT_CAT= A);(更高效)SELECTENAMEFROMDEPTD,EMPEWHEREE.DEPT_NO=D.DEPT_NOANDDEPT_CAT= A;.用 EXISTS 替換 DISTINCT當(dāng)提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT. 一般可以考慮用 EX

25、IST替換例如:低效:SELECTDISTINCTDEPT_NO,DEPT_NAMEFROMDEPTD,EMPEWHERED.DEPT_NO=E.DEPT_NO局效:SELECTDEPT_NO,DEPT_NAMEFROMDEPTDWHEREEXISTS(SELECT XFROMEMPEWHEREE.DEPT_NO=D.DEPT_NO);,立刻返回結(jié)EXISTS使查詢更為迅速,因?yàn)镽DBMS核心模塊將在子查詢的條件一旦滿足后 果.識別低效執(zhí)行的 SQL語句用下列SQL工具找出低效SQL:SELECTEXECUTIONS,DISK_READS,BUFFER_GETS,ROUND(BUFFER_GE

26、TS-DISK_READS)/BUFFER_GETS,2)Hit_radio,ROUND(DISK_READS/EXECUTIONS,2)Reads_per_run,SQL_TEXTFROMV$SQLAREAWHEREEXECUTIONS0ANDBUFFER_GETS0AND(BUFFER_GETS-DISK_READS)/BUFFER_GETSlist1SELECT*2FROMdept,emp3*WHEREemp.deptno=dept.deptnoSQLsetautotraceonexp;/*traceonly可以不顯示執(zhí)行結(jié)果*/或者 SQLsetautotracetraceonlyex

27、p;SQL/14rowsselected.ExecutionPlan0SELECTSTATEMENTOptimizer=CHOOSE10NESTEDLOOPS21TABLEACCESS(FULL)OFEMP31TABLEACCESS(BYINDEXROWID)OFDEPT43INDEX(UNIQUESCAN)OFPK_DEPT(UNIQUE)Statistics0recursivecalls2dbblockgets30consistentgets0physicalreads0redosize2598bytessentviaSQL*Nettoclient503bytesreceivedviaSQ

28、L*Netfromclient2SQL*Netroundtripsto/fromclient0sorts(memory)0sorts(disk)14rowsprocessed通過以上分析,可以得出實(shí)際的執(zhí)行步驟是1.TABLEACCESS(FULL)OFEMP2.INDEX(UNIQUESCAN)OFPK_DEPT(UNIQUE)3.TABLEACCESS(BYINDEXROWID)OFDEPT4.NESTEDLOOPS(JOINING1AND3)ORACLESQL性能優(yōu)化系列(八).用索引提高效率索引是表的一個概念部分,用來提高檢索數(shù)據(jù)的效率.實(shí)際上,ORACLE使用了一個復(fù)雜的自 平衡B-

29、tree 結(jié)構(gòu).通常,通過索引查詢數(shù)據(jù)比全表掃描要快.當(dāng)ORACLE找出執(zhí)行查詢和Update語句的最佳路徑時,ORACLE優(yōu)化器將使用索引.同樣在聯(lián)結(jié)多個表時使用索引也可 以提高效率.另一個使用索引的好處是,它提供了主鍵(primarykey)的唯一性驗(yàn)證.除了那些LONG或LONGRAW 數(shù)據(jù)類型,你可以索引幾乎所有的列.通常,在大型表中使用索 引特別有效.當(dāng)然你也會發(fā)現(xiàn),在掃描小表時使用索引同樣能提高效率.雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價.索引需要空間來存儲,也需要定期維護(hù),每當(dāng)有記錄在表中增減或索引列被修改時,索引本身也會被修改.這意味著每條記錄的INSE

30、RT,DELETE,UPDATE將為此多付出4,5次的磁盤I/O.因?yàn)樗饕枰~ 外的存儲空間和處理,那些不必要的索引反而會使查詢反應(yīng)時間變慢譯者按:定期的重構(gòu)索引是有必要的ALTERINDEXREBUILD.索引的操作ORACLE對索引有兩種訪問模式.索弓I 唯一掃描(INDEXUNIQUESCAN)大多數(shù)情況下,優(yōu)化器通過WHERE子句訪問INDEX.例如:表LODGING 有兩個索引:建立在LODGING 列上的唯一性索引 LODGING_PK 和建立在 MANAGER 歹U上的非唯一性索弓 I LODGING$MANAGER.SELECT*FROMLODGINGWHERELODGING

31、= ROSEHILL在內(nèi)部,上述SQL將被分成兩步執(zhí)行,首先,LODGING_PK索引將通過索引唯一掃描的方式被訪問,獲得相應(yīng)的ROWID,通過ROWID訪問表的方式執(zhí)行下一步檢索.如果被檢索返回的列包括在INDEX列中,ORACLE將不執(zhí)行第二步的處理(通過ROWID訪問表).因?yàn)闄z索數(shù)據(jù)保存在索引中,單單訪問索引就可以完全滿足查詢結(jié)果.下面SQL只需要INDEXUNIQUESCAN 操作.SELECTLODGINGFROMLODGINGWHERELODGING= ROSEHILL ;索引范圍查詢(INDEXRANGESCAN)適用于兩種情況:.基于一個范圍的檢索.基于非唯一性索引的檢索例1

32、:SELECTLODGINGFROMLODGINGWHERELODGINGLIKE M% ;WHERE子句條件包括一系列值,ORACLE將通過索引范圍查詢的方式查詢 LODGING_PK. 由于索引范圍查詢將返回一組值,它的效率就要比索引唯一掃描低一些.例2:SELECTLODGINGFROMLODGINGWHEREMANAGER= BILLGATES ;這個SQL的執(zhí)行分兩步,LODGING$MANAGER 的索引范圍查詢(得到所有符合條件記錄的ROWID)和下一步同過 ROWID訪問表得到LODGING列的值.由于LODGING$MANAGER 是一個非唯一性的索引,數(shù)據(jù)庫不能對它執(zhí)彳T索

33、引唯一掃描.由于SQL返回LODGING歹U,而它并不存在于 LODGING$MANAGER 索引中,所以在索引范 圍查詢后會執(zhí)行一個通過 ROWID訪問表的操作.WHERE子句中,如果索引列所對應(yīng)的值的第一個字符由通配符(WILDCARD)開始,索引將不被采用.SELECTLODGINGFROMLODGINGWHEREMANAGERLIKE % HANMAN ;在這種情況下,ORACLE將使用全表掃描.ORACLESQL性能優(yōu)化系列(九).基礎(chǔ)表的選擇基礎(chǔ)表(DrivingTable)是指被最先訪問的表(通常以全表掃描的方式被訪問).根據(jù)優(yōu)化器的不 同,SQL語句中基礎(chǔ)表的選擇是不一樣的如果

34、你使用的是 CBO(COSTBASEDOPTIMIZER), 優(yōu)化器會檢查 SQL語句中的每個表的物理大小,索引的狀態(tài),然后選用花費(fèi)最低的執(zhí)行路徑如果你用RBO(RULEBASEDOPTIMIZER),并且所有的連接條件都有索引對應(yīng),在這種情況下 基礎(chǔ)表就是FROM子句中列在最后的那個表.舉例:SELECTA.NAME,B.MANAGERFROMWORKERA,LODGINGBWHEREA.LODGING=B.LODING;由于LODGING 表的LODING 列上有一個索引 ,而且 WORKER 表中沒有相比較的索 引,WORKER表將被作為查詢中的基礎(chǔ)表 .多個平等的索引當(dāng)SQL語句的執(zhí)行

35、路徑可以使用分布在多個表上的多個索引時,ORACLE會同時使用多個索引并在運(yùn)行時對它們的記錄進(jìn)行合并檢索出僅對全部索引有效的記錄.在ORACLE選擇執(zhí)行路徑時,唯一性索引的等級高于非唯一性索引.然而這個規(guī)則只有當(dāng)WHERE子句中索引列和常量比較才有效.如果索引列和其他表的索引類相比較.這種子句 在優(yōu)化器中的等級是非常低的 .如果不同表中兩個想同等級的索引將被引用,FROM子句中表的順序?qū)Q定哪個會被率先使用.FROM子句中最后的表的索引將有最高的優(yōu)先級如果相同表中兩個想同等級的索引將被引用,WHERE子句中最先被引用的索引將有最高的優(yōu)先級.舉例:DEPTNO上有一個非唯一性索引 ,EMP_CA

36、T也有一個非唯一性索引SELECTENAME,FROMEMPWHEREDEPT_NO=20ANDEMP_CAT= A;.執(zhí)行路徑這里,DEPTNO索引將被最先檢索,然后同EMP_CAT索引檢索出的記錄進(jìn)行合并如下:TABLEACCESSBYROWIDONEMPAND-EQUALINDEXRANGESCANONDEPT_IDXINDEXRANGESCANONCAT_IDX.等式比較和范圍比較當(dāng)WHERE子句中有索引列,ORACLE不能合并它們,ORACLE將用范圍比較.舉例:DEPTNO上有一個非唯一性索引 ,EMP_CAT也有一個非唯一性索引 .SELECTENAMEFROMEMPWHEREDEPTNO20ANDEMP_CAT= A;這里只有EMP_CAT索引被用到,然后所有的記錄將逐條與DEPTNO 條件進(jìn)行比較.執(zhí)行路徑如下:TABLEACCESSBYROWIDONEMPINDEXRANGESCANONCAT_IDX.不明確的索引等級當(dāng)ORACLE無法判斷索引的等級高低差別 ,優(yōu)化器將只使用一個索引,它就是在 WHERE子句 中被列在最前面的.舉例:DEPTNO上有一個非唯一性索引 ,EMP_CAT也有一

溫馨提示

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

評論

0/150

提交評論