Oracle 提升查詢性能(基礎)

#1,選擇最有效的表名順序數據庫

 Oracle解析器老是按照從右至左的順序處理FROM後面的表,所以FROM最右邊的表將會被當作驅動表優先處理,當存在多個表關聯時,應當使用記錄少的表當作驅動表。若是關聯的表多的話,則用交叉表做爲驅動表。優化

#2,select中避免使用'*'.排序

#3,  減小數據庫訪問的次數索引

  1. 每當執行一條SQL語句,Oracle 須要完成大量的內部操做,象解析SQL語句,估算索引的利用率,綁定變量, 讀數據塊等等.由此可       效率

  2. 見,減小訪問數據庫的次數,其實是下降了數據庫系統開銷
    變量

#4, 用Where子句替換HAVINGselect

  1. -->儘量的避免having子句,由於HAVING 子句是對檢索出全部記錄以後再對結果集進行過濾。這個處理須要排序,總計等操做                 統計

  2. -->經過WHERE子句則在分組以前便可過濾沒必要要的記錄數目,從而減小聚合的開銷 。數據

#5,使用 UNION ALL 替換 UNION(若是有可能的話)                                                           查詢

  1. 當SQL語句須要UNION兩個查詢結果集時,這兩個結果集合會以UNION-ALL的方式被合併, 而後在輸出最終結果前進行排序。       

  2. 若是用UNION ALL替代UNION, 這樣排序就不是必要了。 效率就會所以獲得提升。                                                                            

  3. UNION ALL會輸出全部的結果集,而UNION則過濾掉重複記錄並對其進行排序.所以在使用時應考慮業務邏輯是否容許當前的結果集存在重複現象  

#6, 有兩個簡單例子,以說明 「exists」和「in」的效率問題

    1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;

       T1數據量小而T2數據量很是大時,T1<<T2 時,1) 的查詢效率高。

    2) select * from T1 where T1.a in (select T2.a from T2) ;

        T1數據量很是大而T2數據量小時,T1>>T2 時,2) 的查詢效率高。

經過使用EXISTS,Oracle會首先檢查主查詢,而後運行子查詢直到它找到第一個匹配項,這就節省了時間。Oracle在執行IN子查詢時,首先執 行子查詢,並將得到的結果列表存放在一個加了索引的臨時表中。在執行子查詢以前,系統先將主查詢掛起,待子查詢執行完畢,存放在臨時表中之後再執行主查 詢。這也就是使用EXISTS比使用IN一般查詢速度快的緣由。

#7, AUTOTRACE

SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 報告,這是缺省模式SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只顯示優化器執行路徑報告 SET AUTOTRACE ON STATISTICS -- 只顯示執行統計信息SET AUTOTRACE ON ----------------- 包含執行計劃和統計信息 SET AUTOTRACE TRACEONLY ------ 同set autotrace on,可是不顯示查詢輸出

相關文章
相關標籤/搜索