在解析的過程中,Oracle會依次將' * '轉換成所有的列名,這是通過查詢數據字典來完成的,這意味著需要更多的時間。
(2)盡可能使用提交:
只要有可能,在程序中盡可能多的使用COMMIT,這樣程序的性能會得到提升,需求也會因為COMMIT釋放的資源而減少。提交釋放的資源有:
A.用於恢復回滾段上的數據的信息。
B.程序語句獲得的鎖。
C.重做日誌緩沖區中的空間。
(3)用Where子句替換HAVING子句:
避免使用HAVING子句,因為HAVING只會在檢索到所有記錄後篩選結果集。這個過程需要排序和合計等操作。
如果可以通過WHERE子句限制記錄的數量,就可以減少這方面的開銷。在三個條件子句(非oracle)中,on、where和having,on是第壹個被執行的,where是第二個,having是最後壹個。因為on在做統計之前先過濾掉不符合條件的記錄,可以減少中間運算要處理的數據,這個應該是最快的,where應該比having快,因為它在求和之前先過濾數據,連接兩個表的時候用on。
在單表查詢統計的情況下,如果要過濾的條件不涉及要計算的字段,它們的結果是壹樣的,但是where可以使用rushmore技術,having卻不行,而且後者的速度更慢。如果涉及到要計算的字段,說明這個字段的值在計算之前是不確定的。按照上壹篇文章寫的工作流程,where的動作時間是在計算之前完成的,having只有在計算之後才生效。
在多表連接查詢中,on比where工作得早。系統先根據表與表之間的連接條件,將多個表組合成壹個臨時表,然後按where篩選,再計算,再按。
必須過濾。因此,如果妳想讓過濾條件發揮正確的作用,妳必須先理解這篇文章。
應該什麽時候起作用,然後再決定放在哪裏。
⑷將IN替換為EXISTS,將NOT IN替換為NOTEXISTS:
在許多基於基本表的查詢中,為了滿足壹個條件,通常需要連接另壹個表。
在這種情況下,使用EXISTS(或NOTEXISTS)通常會提高查詢的效率。在子查詢中,NOT IN子句將執行內部排序和合並。在任壹情況下,
、NOTIN是效率最低的(因為它對子查詢中的表執行全表遍歷)。為了避免使用NOT IN,我們可以將其重寫為外部連接或NOT EXISTS。
示例:
(高效)
SELECT* FROM EMP(基本表)其中EMPNO > 0且存在(SELECT ' X ' FROM DEPT WHEREDEPT。DEPTNO = EMP。DEPTNO和LOC = 'MELB ')
(效率低下)
SELECT* FROM EMP(基本表),其中EMPNO > 0,DEPTNO IN(SELECT DEPTNO FROM DEPT,其中LOC = 'MELB ')
(5)利用索引提高效率:
索引是表的概念部分,用於提高檢索數據的效率。
Oracle使用復雜的自平衡B樹結構。壹般來說,按索引查詢數據比掃描整個表要快。當Oracle找到執行查詢和更新語句的最佳路徑時,Oracle優化器會使用索引。類似地,在連接多個表時使用索引也可以提高效率。使用索引的另壹個優點是它提供了主鍵的唯壹性驗證。
對於那些LONG或LONG RAW數據類型,幾乎可以索引所有的列。通常,在大型表中使用索引特別有效。當然,妳也會發現,在掃描小表的時候,使用索引也可以提高效率。雖然使用索引可以提高查詢效率,但也要註意它的代價。
索引需要空間來存儲,也需要定期維護。每當在表中添加或刪除記錄或者修改索引列時,索引本身也會被修改。這意味著每個記錄的插入、刪除和更新將花費4到5倍的磁盤I/O。因為索引需要額外的存儲空間和處理,這些不必要的索引將降低查詢響應時間。有必要定期重建索引:
ALTERINDEX & ltINDEXNAME & gt重建& lt表空間名稱& gt(18)將DISTINCT替換為EXISTS:提交包含壹對多信息表(如部門表和員工表)的查詢時,請避免在SELECT子句中使用DISTINCT。壹般可以考慮用EXISTS代替,這樣查詢速度更快,因為只要滿足子查詢的條件,RDBMS核心模塊就會返回結果。
示例:
(效率低下):
SELECTDISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E其中D.DEPT_NO = E.DEPT_NO
(高效):
SELECTDEPT_NO,DEPT _ NAME FROM DEPT D WHERE EXISTS(SELECT ' X FROM EMP E WHERE E。部門編號= D .部門編號);