不用“*”代替所有列名
在SELECT語句中,當查詢所有表中的列時,為了減少編寫SQL語句的難度和重複性的工作,可以使用“*”代替所有列名。用“*”代替所有列的列名對Oracle系統來說,會存在解析的動態問題。
SQL語句的執行過程如下。
(1)SQL語句首先從客戶端進行傳遞到伺服器端程序。
(2)在共享池中,查詢是否由此SQL語句。
(3)判斷SQL語句的語法正確性。
(4)查詢資料字典來驗證表和列定義。
(5)檢查當前使用者的操作許可權。
(6)確定語句的最佳執行計劃。
(7)將語句和執行計劃儲存到共享的SQL區。
在確保完整性的情況下多用COMMIT語句
當用戶將幾個相互聯絡的DML語句寫在一個Begin。。。End塊中時,建議在每個塊的End前面使用COMMIT語句。這樣可以實現對DML語句的及時提交,同時也釋放事務所佔用的資源
儘量用WHERE語句代替HAVING
在SELECT查詢語句中,若有查詢條件時,應使用WHERE語句進行條件篩選,分組時使用HAVING語句進行分組中的條件篩選,也就是先進行分組,然後執行分組後的條件篩選。
用TRUNCATE代替DELETE
一般在刪除表中的資料時,經常會使用DELETE語句。當用DELETE語句刪除資料時,Oracle會使用撤銷表空間來存放刪除操作的資訊。如果使用者沒有使用COMMIT提交語句,而是使用ROLLBACK語句進行回滾操作,則Oracle系統會將資料恢復到刪除之前的狀態。
儘量使用錶鏈接來代替表的多次查詢
在從多個表中查詢資料時,執行表的連結比使用巢狀多個表的查詢的效率要高,這是因為每次執行查詢語句時,Oracle內部要執行一系列的操作。所以要儘量減少訪問SQL語句的執行次數。
用EXISTS代替IN
在查詢時,IN運算子用於檢查一個值是否在列表中,它需要對查詢的表執行一個全表遍歷。而EXISTS只是檢查行是否存在。因此,在子查詢中,EXISTS的效能要比IN的效能要高的多。
用EXISTS代替DISTINCT
在連線查詢中,DISTINCT關鍵字用於禁止重複行的顯示;EXISTS用於檢查子查詢返回的行的存在性。
使用“<=”代替“<”
在有檢索條件的語句中,經常要使用運算子“<=”代替“<”,其中,前者表示小於等於某個值,後者表示小於某個值。
使用制定的詳細列名
在查詢中如果有多個表,如果查詢的列在多張表中都有,這時可以為每個表指定表的別名。