資源描述:
《oracle常用sql技巧收藏》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、Gotostartofmetadata1.?SELECT子句中避免使用?“*”?????當(dāng)你想在SELECT子句中列出所有的COLUMN時(shí),使用動(dòng)態(tài)SQL列引用?‘’?是一個(gè)方便的方法.不幸的是,這是一個(gè)非常低效的方法.?實(shí)際上,ORACLE在解析的過程中,?會(huì)將“”?依次轉(zhuǎn)換成所有的列名,?這個(gè)工作是通過查詢數(shù)據(jù)字典完成的,?這意味著將耗費(fèi)更多的時(shí)間.?2.使用DECODE函數(shù)來減少處理時(shí)間?????使用DECODE函數(shù)可以避免重復(fù)掃描相同記錄或重復(fù)連接相同的表.?例如:?Sql代碼??SELECTC
2、OUNT(*),SUM(SAL)FROMEMPWHEREDEPT_NO=0020ANDENAMELIKE‘SMITH%’;SELECTCOUNT(*),SUM(SAL)FROMEMPWHEREDEPT_NO=0030ANDENAMELIKE‘SMITH%’;????你可以用DECODE函數(shù)高效地得到相同結(jié)果:?Sql代碼?SELECTCOUNT(decode(dept_no,0020,’x’,NULL))d0020_count,COUNT(decode(dept_no,0030,’x’,NULL))d0
3、030_count,SUM(decode(dept_no,0020,sal,NULL))d0020_sal,SUM(decode(dept_no,0030,sal,NULL))d0030_salFROMempWHEREenameLIKE‘smith%’;????類似的,DECODE函數(shù)也可以運(yùn)用于GROUP?BY?和ORDER?BY子句中.?3.刪除重復(fù)記錄????最高效的刪除重復(fù)記錄方法?(?因?yàn)槭褂昧薘OWID)?DELETEFROMempeWHEREe.rowid>(SELECTMIN(x.row
4、id)FROMempxWHEREx.emp_no=e.emp_no);4.?用TRUNCATE替代DELETE?????當(dāng)刪除表中的記錄時(shí),在通常情況下,回滾段(rollback?segments?)?用來存放可以被恢復(fù)的信息,如果你沒有COMMIT事務(wù),ORACLE會(huì)將數(shù)據(jù)恢復(fù)到刪除之前的狀態(tài)(準(zhǔn)確地說是恢復(fù)到執(zhí)行刪除命令之前的狀況),而當(dāng)運(yùn)用TRUNCATE時(shí),?回滾段不再存放任何可被恢復(fù)的信息.當(dāng)命令運(yùn)行后,數(shù)據(jù)不能被恢復(fù).因此很少的資源被調(diào)用,執(zhí)行時(shí)間也會(huì)很短.?5.計(jì)算記錄條數(shù)?????和一般
5、的觀點(diǎn)相反,?count(*)?比count(1)稍快?,當(dāng)然如果可以通過索引檢索,對(duì)索引列的計(jì)數(shù)仍舊是最快的.?例如?COUNT(EMPNO)?6.用Where子句替換HAVING子句?????避免使用HAVING子句,HAVING?只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過濾,這個(gè)處理需要排序、總計(jì)等操作,如果能通過WHERE子句限制記錄的數(shù)目,那就能減少這方面的開銷,?例如:?Sql代碼??--低效SELECTregion,avg(log_size)FROMlocationGROUPBYregion
6、HAVINGregion<>'sydney'ANDregion<>'perth'--高效SELECTregion,avg(log_size)FROMlocationWHEREregion<>'sydney'ANDregion<>'perth'GROUPBYregion7.?用EXISTS替代IN????在許多基于基礎(chǔ)表的查詢中,為了滿足一個(gè)條件,往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接.在這種情況下,?使用EXISTS(或NOT?EXISTS)通常將提高查詢的效率.?--低效SELECT*FROMempWHEREem
7、pno>0ANDdeptnoIN(SELECTdeptnoFROMdeptWHEREloc=‘melb’);--高效:SELECT*FROMempWHEREempno>0ANDEXISTS(SELECT‘x’FROMdeptWHEREdept.deptno=emp.deptnoANDloc=‘melb’);8.用NOT?EXISTS替代NOT?IN????在子查詢中,NOT?IN子句將執(zhí)行一個(gè)內(nèi)部的排序和合并.?無論在哪種情況下,NOT?IN都是最低效的?(因?yàn)樗鼘?duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷).??
8、為了避免使用NOT?IN,我們可以把它改寫成外連接(Outer?Joins)或NOT?EXISTS.?例如:?SELECT?…FROM?EMP??WHERE?DEPT_NO?NOT?IN?(SELECT?DEPT_NO?FROM?DEPT?WHERE?DEPT_CAT=’A’);?Sql代碼??--為了提高效率改寫為:(方法一:高效)SELECTFROMempa,deptbWHEREa.dept_no=b.deptANDb.dept_noI