Oracle sql 優化 常用方式

2022-03-29 18:43:00 字數 2280 閱讀 8049

1、不要用 '*' 代替所有列名,特別是字段比較多的情況下

使用select * 可以列出某個表的所有列名,但是這樣的寫法對於oracle來說會存在動態解析問題。oracle系統通過查詢資料字典將 '*' 轉換成表的所有列名,這自然會消耗系統時間。

2、進行全表刪除時,用truncate代替delete

當用delete刪除表的資料行時,oracle會使用撤銷表空間(undo tablespace)來存放恢復的資訊。在這期間,如果使用者沒有發出commit語句,而是發出rollback語句,oracle系統會將資料恢復到刪除之前的狀態,當使用者使用truncate對錶的資料進行刪除時,系統不會將被刪除的資料寫到回滾段(撤銷表空間)裡,速度自然快些。

3、在確保完整性的情況下多使用commit

在pl/sql塊中,經常將幾個相互聯絡的dml語句寫到乙個begin...end塊中,建議在每個dml語句結尾加上commit,這樣可以使用物件dml語句及時提交,同時也釋放事務所占用的資源。

4、儘量減少表的查詢次數

在含有多個子查詢的sql中,要注意減少對錶的查詢。

示例:

--

inefficient sql

select tab_name1,tab_name2 from

table_name

where tab_name1 = (select tab_n1 from

table_n)

and tab_name2 = (select tab_n2 from

table_n)

--efficient sql

select tab_name1,tab_name2 from

table_name

where (tab_name1,tab_name2)= (select tab_n1,tab_n2 from

table_n)

5、使用exists代替in,使用not exists代替not in

在子查詢中,in使用乙個內部的排序和合併,無論在哪種情況下,not in都是最低效的,因為它對子查詢中的表執行了全表遍歷,為了避免使用not in,我們可以把它改寫為外連線(outer join)或者是not exists。但並不代表not in 完全不可用,我們一分為二來看待此問題:若子查詢返回的資料集較複雜,避免使用not in;當子查詢返回的資料集較簡單或者可列舉,not in也可以使用。

exists和in使用同理。

6、合理使用函式

不合理的函式使用方式會對資料庫造成嚴重的效能問題,即使乙個非常簡單的函式,因為其使用不當,都可能造成嚴重的後果。

示例:

--

inefficient sql

for i in

0...10

loop

select

count(*) into i_cnt from

race_results

where horse_name = format_name('

xiaobai');

endloop;

--efficient sql

for i in

0...10

loop

select

count(*) into i_cnt from

race_results

where horse_name = (select format_name('

xiaobai

') from

dual);

end loop;

當函式在where子句中使用時,查詢結果得到的每一行記錄均會呼叫該函式一次。

7、正確選擇from表順序

在基於規則的優化器(rule-based optimizer)下,oracle解析器按照從右至左的順序處理from後的表名,因此寫在from中最後的表將會被先處理,先處理的表也稱為驅動表,在from子句中包含多個表的情況下,建議選擇資料量最少的表作為驅動表。原因:當oracle處理多個表時,會運用排序或合併的方式連線它們。首先,系統掃瞄from中最後的表,並對該錶的資料進行排序;然後,掃瞄from中倒數第二個表;最後,將所有從第二個表中檢索出來的記錄和第乙個表中的合適記錄進行合併,取交集。

如果有三個以上的表連線,則建議使用交叉表(intersection table)作為驅動表,所謂交叉表指的是被其他表所引用的表。

8、where子句條件的連線順序

oracle採用自下而上順序解析where子句,按照這個原理,表連線的條件必須寫在其他條件之前,那些能過濾掉最大記錄的條件必須寫在where子句的末尾,也就是表在連線操作以前,能過濾的資料量越大越好。

Oracle Sql優化筆記

基本的sql編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自動對sql語句進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用cbo cost based optimization,基於代價的優化方式 時。我們可以總結一下可能引起全表掃瞄的操作 oracle優化器...

Oracle Sql優化筆記

基本的sql 編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自 動對sql語句 進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用 cbo cost based optimization 基於代價的 優化方式 時。我們可以 總結一下可能引起全表 掃瞄的操作 or...

Oracle Sql優化筆記

基本的sql編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自動對sql語句進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用cbo cost based optimization,基於代價的優化方式 時。我們可以總結一下可能引起全表掃瞄的操作 oracle優化器...