1丶選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效):
Oracle的解析器按照從右到左的順序處理FROM子句中的表名,F(xiàn)ROM子句中寫(xiě)在最后的表(基礎(chǔ)表 driving table)將被最先處理烂完,在FROM子句中包含多個(gè)表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎(chǔ)表棱貌。如果有3個(gè)以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎(chǔ)表, 交叉表是指那個(gè)被其他表所引用的表蚓哩。
2丶WHERE子句中的連接順序:
Oracle采用自下而上的順序解析WHERE子句,根據(jù)這個(gè)原理,表之間的連接必須寫(xiě)在其他WHERE條件之前, 那些可以過(guò)濾掉最大數(shù)量記錄的條件必須寫(xiě)在WHERE子句的末尾。
3丶SELECT子句中避免使用‘*’:
Oracle在解析的過(guò)程中, 會(huì)將‘*’依次轉(zhuǎn)換成所有的列名, 這個(gè)工作是通過(guò)查詢數(shù)據(jù)字典完成的, 這意味著將耗費(fèi)更多的時(shí)間。
4丶使用DECODE函數(shù)來(lái)減少處理時(shí)間:
使用DECODE函數(shù)可以避免重復(fù)掃描相同記錄或重復(fù)連接相同的表隘谣。
5丶整合簡(jiǎn)單,無(wú)關(guān)聯(lián)的數(shù)據(jù)庫(kù)訪問(wèn):
如果你有幾個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)查詢語(yǔ)句,你可以把它們整合到一個(gè)查詢中(即使它們之間沒(méi)有關(guān)系)。
6丶用TRUNCATE替代DELETE:
當(dāng)刪除表中的記錄時(shí),在通常情況下, 回滾段(rollback segments ) 用來(lái)存放可以被恢復(fù)的信息. 如果你沒(méi)有COMMIT事務(wù),ORACLE會(huì)將數(shù)據(jù)恢復(fù)到刪除之前的狀態(tài)(準(zhǔn)確地說(shuō)是恢復(fù)到執(zhí)行刪除命令之前的狀況) 而當(dāng)運(yùn)用TRUNCATE時(shí), 回滾段不再存放任何可被恢復(fù)的信息啄巧。當(dāng)命令運(yùn)行后,數(shù)據(jù)不能被恢復(fù).因此很少的資源被調(diào)用,執(zhí)行時(shí)間也會(huì)很短寻歧。(TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)掌栅。
7丶使用表的別名(Alias):
當(dāng)在SQL語(yǔ)句中連接多個(gè)表時(shí), 請(qǐng)使用表的別名并把別名前綴于每個(gè)Column上。這樣一來(lái),就可以減少解析的時(shí)間并減少那些由Column歧義引起的語(yǔ)法錯(cuò)誤码泛。
8丶用>=替代>:
高效:SELECT * FROM EMP WHERE DEPTNO >=4?
低效: SELECT * FROM EMP WHERE DEPTNO >3
兩者的區(qū)別在于猾封,前者DBMS將直接跳到第一個(gè)DEPT等于4的記錄而后者將首先定位到DEPTNO=3的記錄并且向前掃描到第一個(gè)DEPT大于3的記錄。
9丶SQL語(yǔ)句用大寫(xiě)的:
因?yàn)镺racle總是先解析SQL語(yǔ)句噪珊,把小寫(xiě)的字母轉(zhuǎn)換成大寫(xiě)的再執(zhí)行晌缘。
10丶用Where子句替換HAVING子句:
避免使用HAVING子句,HAVING 只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過(guò)濾卿城。這個(gè)處理需要排序,總計(jì)等操作枚钓。如果能通過(guò)WHERE子句限制記錄的數(shù)目,那就能減少這方面的開(kāi)銷瑟押。
本文來(lái)自微信公眾號(hào)框架師{mohu121]關(guān)注獲取更多資料