優化SQL的建議

2021-07-23 05:39:20 字數 1394 閱讀 7107

1.用truncate替代delete

當刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復的資訊。 如果你沒有

commit事務,oracle會將資料恢復到刪除之前的狀態(準確地說是恢復到執行刪除命令之前的狀況)

而當運用truncate時,回滾段不再存放任何可被恢復的資訊。當命令執行後,資料不能被恢復。因此很少的資源被調

用,執行時間也會很短。

(注: truncate只在刪除全表適用,truncate是ddl不是dml)

2.用exists替代in

在許多基於基礎表的查詢中,為了滿足乙個條件,往往需要對另乙個表進行聯接。在這種情況下,使用exists(或not

exists)通常將提高查詢的效率。同理,not exists和not in。

3.select子句中避免使用 『*』

當你想在select子句中列出所有的column時,使用動態sql列引用『*』是乙個方便的方法。不幸的是,這是乙個非常低

效的方法。實際上,oracle在解析的過程中, 會將『*』依次轉換成所有的列名,這個工作是通過查詢資料字典完成的,

這意味著將耗費更多的時間。

4.選擇最有效率的表名順序(只在基於規則的優化器中有效)

oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表(基礎表 driving table

)將被最先處理。 在from子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。當oracle處理多個表

時, 會運用排序及合併的方式連線它們。首先,掃瞄第乙個表(from子句中最後的那個表)並對記錄進行排序,然後掃

描第二個表(from子句中最後第二個表),最後將所有從第二個表中檢索出的記錄與第乙個表中合適記錄進行合併。

5.避免在索引列上使用計算

where子句中,如果索引列是函式的一部分。優化器將不使用索引而使用全表掃瞄。

6.盡量多使用commit

只要有可能,在程式中盡量多使用commit, 這樣程式的效能得到提高,需求也會因為commit所釋放的資源而減少:

commit所釋放的資源:

a.回滾段上用於恢復資料的資訊。

b.被程式語句獲得的鎖

c.redo log buffer 中的空間

d.oracle為管理上述3種資源中的內部花費

(注意:在使用commit時必須要注意到事務的完整性,現實中效率和事務完整性往往是魚和熊掌不可得兼)

7.使用表的別名

當在sql語句中連線多個表時,請使用表的別名並把別名字首於每個column上。這樣一來,就可以減少解析的時間並

減少那些由column歧義引起的語法錯誤。

對於case when 可以考慮換成decode,應該也會快一點

sql優化建議

1 少用 不用 多表操作 子查詢,連線查詢 2 大量資料的插入 多條insert load data into talbe 建議,先關閉約束及索引,完成資料插入,再重新生成索引及約束。針對myisam alter table 表名 disable keys 禁用索引約束 alter table 表名...

SQL優化建議

這篇文章久之前,不知從 看到就儲存在本地的txt文件中,現在貼到部落格中,防止消失。1.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 select id from t where num is null 可以在num上設定預設值0,確保表...

sql語句優化建議

1.不論乙個sql中涉及到多少表,每次都用兩個表 結果集 操作,得到新的結果後,再和下乙個表 結果集 操作。2.避免在select f1,select f2 from tableb from tablea 這樣得到欄位列。直接用tablea和tableb關聯得到a.f1,b.f2就可以了。3.避免隱...