sql查詢優化 oracle

2021-10-07 02:21:09 字數 1478 閱讀 6820

1. oracle自上而下解析where語句,表關聯語句寫在前面,過濾條件寫在後面

2. 避免使用*查詢(*操作是查詢資料字典,耗時)

3. 子查詢儘量減少對錶的查詢

select col1, col2 from t1 where col1 = (select col1 from t2 where ...)

4. 使用decode函式減少處理時間

5. 使用別名as

6. exists代替in,not exists代替not in    

select * from a where exists (select * from b where b.id = a.id);

select * from a where a.id in (select id from b);

exists()適合b錶比a表資料大的情況

in()適合b錶比a表資料小的情況

無論那個表大,用not exists都比not in要快

7. 用exists代替distinct

8. oracle查詢語句用大寫,因為oracle總是先解析sql語句,把小寫的字母轉換成大寫的再執行

9. 避免索引列上使用not

10. 避免索引列上使用計算

select * from tab where col * 3 > 10 改為 select * from tab where col > 10/3

11. 用》=代替》

12. 用union替換or (適用於索引列)

通常情況下,用union替換where子句中的or將會起到較好的效果。對索引列使用or將造成全表掃瞄。注意,以上規則只針對多個索引列有效。如果有 column沒有被索引,查詢效率可能會因為你沒有選擇or而降低。

13. 用in來替換or

14. 避免在索引列上使用is null和is not null

15. 某些select 語句中的where子句不使用索引

(1)『!=' 將不使用索引。

(2)『||'是字元連線函式。

(3)『+'是數學函式。

(4)相同的索引列不能互相比較,這將會啟用全表掃瞄。 

16. a. 如果檢索資料量超過30%的表中記錄數,使用索引將沒有顯著的效率提高。 

b. 在特定情況下,使用索引也許會比全表掃瞄慢,但這是同乙個數量級上的區別。而通常情況下,使用索引比全表掃瞄要塊幾倍乃至幾千倍!

17. 帶有distinct,union,minus,intersect,order by的sql語句會啟動sql引擎執行耗費資源的排序(sort)功能。distinct需要一次排序操作,而其他的至少需要執行兩次排序。通常,帶有 union, minus , intersect的sql語句都可以用其他方式重寫。如果你的資料庫的sort_area_size調配得好。使用union , minus, intersect也是可以考慮的, 畢竟它們的可讀性很強。

18. 提高group by 語句的效率,可以通過將不需要的記錄在group by 之前過濾掉。

ORACLE中SQL查詢優化研究

查詢計畫及主要統計資料如下 執行計畫 2 1 hash join cost 5 card 14 bytes 224 3 2 table access full of dept cost 2 card 4 bytes 52 4 2 table access full of emp cost 2 car...

查詢優化 SQL優化

查詢優化注意點 代表查詢速度比較 1 所有查詢必須注意 的使用必要性 cout 1 cout 2 字段 主鍵索引 字段 普通索引 字段 沒有索引 3 乙個字段 多個字段 欄位多越慢 4 大於10000和大於10001的區別 後者大於前者 5 列沒別名 列 有別名6 兩個條件,where時應該將符合資...

oracle中sql語句查詢優化 四

9 union操作符 union在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最常見的是過程表與歷史 表union。如 複製 如下 select from gc dfys union select fr...