1. 使用truncate代替delete
oracle執行delete後會將被刪除的資料存放到undo表空間以便恢復,如果之後使用者使用rollback而不是commit,則oracle會利用undo表空間中的資料進行恢復。而是用truncate時,oracle不會將被刪除的資料放入undo表空間,因而速度要快很多。
2. 活用commit
pl/sql塊中,經常將幾個相互聯絡的dml語句寫在begin...end,如果不影響事務的完整性,則建議在每個end前面寫乙個commit,以達到對dml的及時提交和釋放事務所佔資源的目的。
3. where子句如何寫
oracle優化器的原理是採用自下而上的順序解析where子句,因此表之間的連線永遠寫在where後面的第乙個位置,並對過濾條件進行估算,
可過濾掉最大數量記錄的條件必須寫在where子句的末尾。
select count(*)
from bigtab a, smalltab b
where a.owner = b.owner
and a.object_name = b.table_name
and b.num_rows > 80
4. 取別名:
聯合表的查詢中,表名和列名以乙個字母為別名可提高1.5倍查詢速度
5. 充分利用索引
[何時需要索引?]
(1) 如果檢索全表,不必要建索引,因為索引會帶來額外的io操作,
如果檢索的記錄數占全部表記錄的10%以下,可以考慮建索引(大 )
(2) 表之間的關聯字段可以考慮建索引,特別是一張大表和一張小表的關聯
(3) 如果表的記錄數比較少時,不建議使用索引,如資料不超過1萬行的表不要建立索引
(4) 索引是把雙刃劍,在查詢和dml之間尋求平衡
[什麼列上需要索引?]
(1) 經常在where子句中使用的列
(2) sql語句中經常用於表之間連線的列
(3) 不宜將經常update的列作為索引項
(4) 不宜將經常需要和函式或操作符相結合的列作為索引項
[索引的缺點]
(1) 索引需要磁碟儲存空間
(2) 降低了資料維護速度,如delete update insert操作
(3) 過度或不恰當的索引,反而會帶來資料檢索效率的降低,如表資料很少時。
舉例說明:
(1) 索引對is null的限制:使用預設值代替空值
(2) 索引對不等號和not的限制: != 或 <> (不等於) 操作不走索引,推薦a <> 0 改為 a > 0 or a < 0
(3) 索引對不匹配資料型別的限制:提防隱式型別轉換,oracle內部處理 a = 0 與 a = 『0』 是完全不同的,會導致不走索引
(4) 索引對函式的限制:
select * from bigtab a where substr(a.object_name, 3, 5) = 'ntab1'
如果在where子句中經常要使用函式時,應該建立基於函式的索引,且只有當查詢語句包含該函式或者表示式時,基於函式的索引才會被呼叫。
建立並使用函式索引:
create index idx_bigtab_objectname_part
on bigtab(substr(object_name, 3, 5)) tablespace ts_oralearn_idx;
Mysql高階高階(sql優化)
目錄 一 mysql高階有哪些東西?1 mysql的架構 2 索引優化分析 3 查詢擷取分析 4 mysql鎖機制 5 主從複製 架構這裡我們主要說的是引擎 看你的mysql現在已提供什麼儲存引擎 看你的mysql當前預設的儲存引擎 show variables like storage engin...
關於SQL的幾道小題詳解 sql高階
當我們拿到題目的時候,並不是急於作答,那樣會得不償失的,而是分析思路,採用什麼方法,達到什麼目的,還要思考有沒有簡單的方法或者通用的方法等等,這樣才會達到以一當十的效果,這樣的慣性思維其實早在我們度高中的時候就被領教了,所謂 萬變不離其宗 吧。以下各題來自日常所見,或qq群,或面試題,或部落格園。題...
MySQL之SQL優化詳解(一)
目錄 序言 在我面試很多人的過程中,很多人談到sql優化都頭頭是道,建索引,explain分析,like全模糊會導致索引失效 云云,於是我問道 優化之前,需要找出資料庫中比如超過2s的慢sql,你是怎麼找的?很多人答不上來,要是找都找不到,怎麼去優化呢,乙個中大型系統可能成千上萬條sql都不過分,難...