oracle多表關(guān)聯(lián)的優(yōu)化問(wèn)題演示教學(xué)_第1頁(yè)
oracle多表關(guān)聯(lián)的優(yōu)化問(wèn)題演示教學(xué)_第2頁(yè)
oracle多表關(guān)聯(lián)的優(yōu)化問(wèn)題演示教學(xué)_第3頁(yè)
oracle多表關(guān)聯(lián)的優(yōu)化問(wèn)題演示教學(xué)_第4頁(yè)
oracle多表關(guān)聯(lián)的優(yōu)化問(wèn)題演示教學(xué)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、o r ac l e 多 表 關(guān) 聯(lián) 的 優(yōu)化問(wèn)題精品文檔收集于網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系管理員刪除ORACLE多表查詢(xún)優(yōu)化ORACLE多表查詢(xún)優(yōu)化這里提供的是執(zhí)行性能的優(yōu)化,而不是后臺(tái)數(shù)據(jù)庫(kù)優(yōu)化器資料參考數(shù)據(jù)庫(kù)開(kāi)發(fā)性能方面的各種問(wèn)題,收集了一些優(yōu)化方案統(tǒng)計(jì)如下(當(dāng)然,象索 引等優(yōu)化方案太過(guò)簡(jiǎn)單就不列入了 ,嘿嘿):執(zhí)行路徑ORACLE勺這個(gè)功能大大地提高了 SQL的執(zhí)行性能并節(jié)省了內(nèi)存的使 用:我們發(fā)現(xiàn),單表數(shù)據(jù)的統(tǒng)計(jì)比多表統(tǒng)計(jì)的速度完全是兩個(gè)概念單表統(tǒng)計(jì)可能 只要0.02秒,但是2張表聯(lián)合統(tǒng)計(jì)就可能要幾十表了 .這是因?yàn)镺RACL只對(duì)簡(jiǎn) 單的表提供高速緩沖(cache buffering),這個(gè)

2、功能并不適用于 多表連接查詢(xún).數(shù)據(jù)庫(kù)管理員必須在init.ora中為這個(gè)區(qū)域設(shè)置合適的參數(shù),當(dāng)這個(gè)內(nèi)存區(qū)域越大,就可以保留更多的語(yǔ)句,當(dāng)然被共享的可能性也就越大了 .當(dāng)你向ORACL提交一個(gè)SQL語(yǔ)句,ORACL會(huì)首先在這塊內(nèi)存中查找相同的語(yǔ) 句.這里需要注明的是ORACLE寸兩者采取的是一種嚴(yán)格匹配,要達(dá)成共享,SQL語(yǔ)句 必須 完全相同(包括空格,換行等).共享的語(yǔ)句必須滿(mǎn)足三個(gè)條件A.字符級(jí)的比較:全相同.當(dāng)前被執(zhí)行的語(yǔ)句和共享池中的語(yǔ)句必須完例如:SELECT * FROM EMP;和下列每一個(gè)都不同SELECT * from EMP;Select * From Emp;SELECT*

3、FROM EMP;B.兩個(gè)語(yǔ)句所指的對(duì)象必須完全相同:用戶(hù)對(duì)象名Jack sal_limit synonymWork_city synonymPla nt_detail synonymJill sal_limit synonymWork_city synonymPla nt_detail owner如何訪(fǎng)問(wèn)private publicpublic private public table考慮一下下列SQL語(yǔ)句能否在這兩個(gè)用戶(hù)之間共享SQL能否共享原因select max(sal_cap) from salimit;不能 每個(gè)用戶(hù)都有一個(gè) privatesynonym - sal_limit ,

4、它們是不同的對(duì)象select count(*) from work_city where sdesc like NEW%;能 兩個(gè)用戶(hù)訪(fǎng)問(wèn)相同的對(duì)象 public synonym - work_city select a.sdesc,b .lo cati on from work_city a , pla nt_detail b wherea.city_id = b.city_id不能 用戶(hù) jack 通過(guò) private synonym 訪(fǎng)問(wèn)plant_detail而jill 是表的所有者,對(duì)象不同.C.兩個(gè)SQL語(yǔ)句中必須使用相同的名字的綁定變量(bindvariables)例如:第一組的

5、兩個(gè)SQL語(yǔ)句是相同的(可以共享),而第二組中的兩個(gè)語(yǔ)句是不 同的(即使在運(yùn)行時(shí),賦于不同的綁定變量相同的值)a.select pin , n ame from people where pin = :blk1.p in;select pin , n ame from people where pin = :blk1.p in;b.select pin , name from people where pin = :blk1.ot_ind;select pin , n ame from people where pin = :blk1.ov_i nd;重點(diǎn)關(guān)注1:選擇最有效率的表名順序(只在基

6、于規(guī)則的優(yōu)化器中有效)重點(diǎn)關(guān)注ORACL的解析器按照從右到左的順序處理 FROM子句中的表名,因此FROM子句中 寫(xiě)在最后的表(基礎(chǔ)表driving table)將被最先處理.在FROM子句中包含多個(gè)表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎(chǔ)表當(dāng)ORACL處理多個(gè)表 時(shí),會(huì)運(yùn)用排序及合并的方式 連接它們.首先,掃描第一個(gè)表(FROM?句中最后的 那個(gè)表)并對(duì)記錄進(jìn)行派序,然后掃描第二個(gè)表(FROM子句中最后第二個(gè)表),最后 將所有從第二個(gè)表中檢索出的記錄與第一個(gè)表中合適記錄進(jìn)行合并例如:表TAB1 16,384 條記錄條記錄表 TAB2 1選擇TAB2作為基礎(chǔ)表(最好的方法)執(zhí)行時(shí)間0.9

7、6秒select coun t(*) from tab1,tab2選擇TAB2作為基礎(chǔ)表(不佳的方法)select count(*) from tab2,tab1執(zhí)行時(shí)間 26.09 秒如果有3個(gè)以上的表連接查詢(xún),那就需要選擇交叉表(intersection table) 作 為基礎(chǔ)表,交叉表是指那個(gè)被其他表所引用的表.例如:EMP表描述了 LOCATIONS和 CATEGORY的交集.SELECTFROM LOCATION L ,CATEGORY C,EMP EWHERE E.EMP_NO BETWEEN 1000 AND 2000AND E.CAT_NO = C.CAT_NOAND E丄

8、OCN = L.L OCN將比下列SQL更有效率SELECT *FROM EMP E ,LOCATION L ,CATEGORYCWHERE E.CAT_NO = C.CAT_NOAND E丄 OCN = L.L OCNAND E.EMP_NO BETWEEN 1000 AND 2000重點(diǎn)關(guān)注2:WHER子句中的連接順序.重點(diǎn)關(guān)注ORACL采用自下而上的順序解析 WHER子句,根據(jù)這個(gè)原理,表之間的連接必須 寫(xiě)在其他WHER條件之前,那些可以過(guò)濾掉最大數(shù)量記錄的條件必須寫(xiě)在 WHERE 子句的末尾.例如:(低效,執(zhí)行時(shí)間156.3秒)SELECT FROM EMP EWHERE SAL ;

9、50000ANDJOB = MANAGERAND25 (SELECT COUNT(*) FROM EMPWHERE MGR=E.EMPNO);(高效,執(zhí)行時(shí)間10.6秒)SELECT FROM EMP EWHERE 25 ; 50000ANDJOB = MANAGER重點(diǎn)關(guān)注3:SELECT子句中避免使用* .重點(diǎn)關(guān)注當(dāng)你想在SELECT?句中列出所有的COLUMN,使用動(dòng)態(tài)SQL列引用 *是一 個(gè)方便的方法.不幸的是,這是一個(gè)非常低效的方法實(shí)際上,ORACL在解析的過(guò) 程中,會(huì)將*依次轉(zhuǎn)換成所有的列名,這個(gè)工作是通過(guò)查詢(xún)數(shù)據(jù)字典完成 的,這意味著將耗費(fèi)更多的時(shí)間7.減少訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的次數(shù)當(dāng)執(zhí)行

10、每條SQL語(yǔ)句時(shí),ORACLED內(nèi)部執(zhí)行了許多工作:解析SQL語(yǔ)句,估算 索引的利用率,綁定變量,讀數(shù)據(jù)塊等等由此可見(jiàn),減少訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的次 數(shù),就能實(shí)際上減少ORACL的工作量.例如,以下有三種方法可以檢索出雇員號(hào)等于 0342或0291的職員.方法1 (最低效)SELECT EMP_NAME , SALARY , GRADEFROM EMPWHERE EMP_NO = 342;SELECT EMP_NAME , SALARY , GRADEFROM EMPWHERE EMP_NO = 291;方法2(次低效)DECLARECURSOR C1 (E_NO NUMBER) ISSELECT EM

11、P_NAME,SALARY,GRADEFROM EMPWHERE EMP_NO = E_NO;BEGINOPEN C1(342);FETCH C1 INTO ;OPEN C1(291);FETCH C1 INTO ;CLOSE C1;END;方法3(高效)SELECT A.EMP_NAME , A.SALARY , A.GRADE, B.EMP_NAME , B.SALARY , B.GRADEFROM EMP A,EMP BWHERE A.EMP_NO = 342AND B.EMP_NO = 291;在SQL*Plus , SQL*Forms和Pro*C中重新設(shè)置ARRAYSIZ參數(shù),可以增

12、加每次 數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的檢索數(shù)據(jù)量,建議值為200.重點(diǎn)關(guān)注4:使用DECODE數(shù)來(lái)減少處理時(shí)間.重點(diǎn)關(guān)注使用DECODE數(shù)可以避免重復(fù)掃描相同記錄或重復(fù) 連接相同的表.例如:SELECT COUNT(*) SUM(SAL)FROM EMPWHERE DEPT_NO = 0020AND ENAME LIKE SMITH%;SELECT COUNT(*) SUM(SAL)FROM EMPWHERE DEPT_NO = 0030AND ENAME LIKE SMITH%;你可以用DECODE數(shù)高效地得到相同結(jié)果SELECT COUNT(DECODE(DEPT_NO,O0X0,NULL) D0020_C

13、OUNT,COUNT(DECODE(DEPT_NO,0030, ,NULL) D0030_COUNT,SUM(DECODE(DEPT_NO,0020,SAL,NULL) D0020_SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL) D0030_SALFROM EMP WHERE ENAME LIKSMITH%;類(lèi)似的,DECOD函數(shù)也可以運(yùn)用于 GROUP B湘ORDER B子句中.重點(diǎn)關(guān)注5:刪除重復(fù)記錄.重點(diǎn)關(guān)注最高效的刪除重復(fù)記錄方法(因?yàn)槭褂昧?ROWID)DELETE FROM EMP EWHERE E.ROWID ; (SELECT MIN(X.ROWID

14、)FROM EMP XWHERE X.EMP_NO = E.EMP_NO);重點(diǎn)關(guān)注6:用TRUNCAT替代 DELETES點(diǎn)關(guān)注當(dāng)刪除表中的記錄時(shí),在通常情況下,回滾段(rollback segments )用來(lái)存放可以被恢復(fù)的信息.如果你沒(méi)有COMMI事務(wù),ORACLED將數(shù)據(jù)恢復(fù)到刪除之前的 狀態(tài)(準(zhǔn)確地說(shuō)是恢復(fù)到執(zhí)行刪除命令之前的狀況)而當(dāng)運(yùn)用TRUNCAT時(shí),回滾段不再存放任何可被恢復(fù)的信息.當(dāng)命令運(yùn)行后,數(shù)據(jù)不能被恢復(fù)因此很少的資源被調(diào)用,執(zhí)行時(shí)間也會(huì)很短(譯者按:TRUNCATE只在刪除全表適用,TRUNCAT是DDL不是DML)重點(diǎn)關(guān)注7:盡量多使用COMM IT重點(diǎn)關(guān)注只要有

15、可能,在程序中盡量多使用COMMIT,這樣程序的性能得到提高,需求也會(huì) 因?yàn)镃OMMIT所釋放的資源而減少:COMMITS釋放的資源:a. 回滾段上用于恢復(fù)數(shù)據(jù)的信息b. 被程序語(yǔ)句獲得的鎖c. redo log buffer中的空間d. ORACL為管理上述3種資源中的內(nèi)部花費(fèi)(譯者按:在使用COMMIT寸必須要注意到事務(wù)的完整性,現(xiàn)實(shí)中效率和事務(wù)完整 性往往是魚(yú)和熊掌不可得兼)重點(diǎn)關(guān)注8:減少對(duì)表的查詢(xún).重點(diǎn)關(guān)注在含有子查詢(xún)的SQL語(yǔ)句中,要特別注意減少對(duì)表的 查詢(xún).例如:低效SELECT TAB_NAMEFROM TABLESWHERE TAB_NAME = ( SELECT TAB_N

16、AMEFROMTAB_COLUMNSWHEREVERSION = 604)AND DB_VER= ( SELECT DB_VERFROMTAB_COLUMNSWHERE VERSION =604)高效SELECT TAB_NAMEFROM TABLESWHERE (TAB_NAME,DB_VER)=(SELECT TAB_NAME,DB_VER)FROM TAB_COLUMNSWHERE VERSION = 604)Update 多個(gè) Column 例子:低效:UPDATE EMPSET EMP_CAT = (SELECT MAX(CATEGORY) FROMEMP_CATEGORIES),S

17、AL_RANGE = (SELECT MAX(SAL_RANGE) FROMEMP_CATEGORIES)WHERE EMP_DEPT = 0020;高效:UPDATE EMPSET (EMP_CAT, SAL_RANGE)=(SELECT MAX(CATEGORY) , MAX(SAL_RANGE)FROM EMP_CATEGORIES)WHERE EMP_DEPT = 0020;重點(diǎn)關(guān)注9:用EXISTS替代IN.重點(diǎn)關(guān)注在許多基于基礎(chǔ)表的 查詢(xún)中,為了滿(mǎn)足一個(gè)條件,往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接 在這種情況下,使用EXISTS或NOT EXISTS通常將提高查詢(xún)的效率.低效:SELECT *

18、FROM EMP基礎(chǔ)表)WHERE EMPNO ; 0AND DEPTNO IN (SELECT DEPTNOFROM DEPTWHERE LOC MELB)高效:SELECT *FROM EMP基礎(chǔ)表)WHERE EMPNO ; 0AND EXISTS (SELECT XFROM DEPTWHERE DEPT.DEPTNO = EMP.DEPTNOAND LOC = MELB) (譯者按:相對(duì)來(lái)說(shuō),用NOT EXISTS替換NOT IN將更顯著地提高效率,下一節(jié)中 將指出) 重點(diǎn)關(guān)注10:用NOT EXISTS替代NOT IN .重點(diǎn)關(guān)注在子查詢(xún)中,NOT IN子句將執(zhí)行一個(gè)內(nèi)部的排序和合并.無(wú)論在哪種情況下,NOT IN都是最低效的(因?yàn)樗鼘?duì)子查詢(xún)中的表執(zhí)行了一個(gè) 全表遍歷).為了避免使用NOT IN ,我們可以把它改寫(xiě)成外 連接(Outer Joi ns) 或NOT EXISTS.例如:SELECT FROM EMPWHERE DEPT_NO NOT IN (SELECT DEPT_NOFROM DEPTWHEREDEPT

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論