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...