(1)選擇最有效率的表名順序(只在基於規則的優化器中有效): ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)將被最早處理,在FROM子句中包含多個表的狀況下,你必須選擇記錄條數最少的表做爲基礎表。若是有3個以上的錶鏈接查詢, 那就須要選擇交叉表(intersection table)做爲基礎表, 交叉表是指那個被其餘表所引用的表. oracle首先,掃描第一個表(FROM子句中最後的那個表)並對記錄進行派序,而後掃描第二個表(FROM子句中最後第二個表),最後將全部從第二個表中檢索出的記錄與第一個表中合適記錄進行合併 (2) WHERE子句中的鏈接順序.: ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的鏈接必須寫在其餘WHERE條件以前, 那些能夠過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾. (3) SELECT子句中避免使用 ‘ * ‘: ORACLE在解析的過程當中, 會將'' 依次轉換成全部的列名, 這個工做是經過查詢數據字典完成的, 這意味着將耗費更多的時間 (4) 減小訪問數據庫的次數: ORACLE在內部執行了許多工做: 解析SQL語句, 估算索引的利用率, 綁定變量 , 讀數據塊等; (5) 在SQLPlus , SQLForms和ProC中從新設置ARRAYSIZE參數, 能夠增長每次數據庫訪問的檢索數據量 ,建議值爲200 (ARRAY[SIZE] {20(默認值)|n} 置一批的行數,是SQL*PLUS一次從數據庫獲取的行數,有效值爲1至5000. 大的值可提升查詢和子查詢的有效性,可獲取許多行,但也須要更多的內存.當超過1000時,其效果不大) (6) 使用DECODE函數來減小處理時間: 使用DECODE函數能夠避免重複掃描相同記錄或重複鏈接相同的表. (DECODE函數的做用:它能夠將輸入數值與函數中的參數列表相比較,根據輸入值返回一個對應值。函數的參數列表是由若干數值及其對應結果值組成的若干序偶形式。固然,若是未能與任何一個實參序偶匹配成功,則函數也有默認的返回值。 select decode( x , 1 , ‘x is 1 ’, 2 , ‘x is 2 ’, ‘others’) from dual 當x等於1時,則返回‘x is 1’。 當x等於2時,則返回‘x is 2’。 不然,返回others) (7) 整合簡單,無關聯的數據庫訪問: 若是你有幾個簡單的數據庫查詢語句,你能夠把它們整合到一個查詢中(即便它們之間沒有關係) (8) 刪除重複記錄: 最高效的刪除重複記錄方法 ( 由於使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); (9) 用TRUNCATE替代DELETE: 當刪除表中的記錄時,在一般狀況下, 回滾段(rollback segments ) 用來存放能夠被恢復的信息. 若是你沒有COMMIT事務,ORACLE會將數據恢復到刪除以前的狀態(準確地說是恢復到執行刪除命令以前的情況) 而當運用TRUNCATE時, 回滾段再也不存聽任何可被恢復的信息.當命令運行後,數據不能被恢復.所以不多的資源被調用,執行時間也會很短. (譯者按: TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML) (10) 儘可能多使用COMMIT: 只要有可能,在程序中儘可能多使用COMMIT, 這樣程序的性能獲得提升,需求也會由於COMMIT所釋放的資源而減小: COMMIT所釋放的資源: a. 回滾段上用於恢復數據的信息. b. 被程序語句得到的鎖 c. redo log buffer 中的空間 d. ORACLE爲管理上述3種資源中的內部花費 (11) 用Where子句替換HAVING子句: 避免使用HAVING子句, HAVING 只會在檢索出全部記錄以後纔對結果集進行過濾. 這個處理須要排序,總計等操做. 若是能經過WHERE子句限制記錄的數目,那就能減小這方面的開銷. (非oracle中)on、where、having這三個均可以加條件的子句中,on是最早執行,where次之,having最後,由於on是先把不符合條件的記錄過濾後才進行統計,它就能夠減小中間運算要處理的數據,按理說應該速度是最快的,where也應該比having快點的,由於它過濾數據後才進行sum,在兩個表聯接時才用on的,因此在一個表的時候,就剩下where跟having比較了。在這單表查詢統計的狀況下,若是要過濾的條件沒有涉及到要計算字段,那它們的結果是同樣的,只是where可使用rushmore技術,而having就不能,在速度上後者要慢若是要涉及到計算的字段,就表示在沒計算以前,這個字段的值是不肯定的,根據上面寫的工做流程,where的做用時間是在計算以前就完成的,而having就是在計算後才起做用的,因此在這種狀況下,二者的結果會不一樣。在多表聯接查詢時,on比where更早起做用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再由where進行過濾,而後再計算,計算完後再由having進行過濾。因而可知,要想過濾條件起到正確的做用,首先要明白這個條件應該在何時起做用,而後再決定放在那裏 (12) 減小對錶的查詢: 在含有子查詢的SQL語句中,要特別注意減小對錶的查詢.例子: SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)數據庫