一般優化途徑:
如果能通過修改語句優化,比如查詢條件或執行順序,sql改不了,可以通過增加索引來解決,增加索引還不行,那就要考慮實現方式是否有問題了
一段sql**寫好以後,可以通過檢視sql的執行計畫,初步**該sql在執行時的效能好壞,尤其是在發現某個sql語句的效率較差時,我們可以通過檢視執行計畫,分析出該sql**的問題所在。
在pl/sql developer中寫好一段sql**後,按f5,pl/sql developer會自動開啟執行計畫視窗,顯示該sql的執行計畫。
1.1. plsql引數解釋
id: 乙個序號,但不是執行的先後順序。執行的先後根據縮進來判斷。
operation: 當前操作的內容。
rows: 當前操作的cardinality,oracle估計當前操作的返回結果集。
cost(cpu):oracle 計算出來的乙個數值(代價),用於說明sql執行的代價。
time:oracle 估計當前操作的時間。
oracle的優化器有兩種:
1.2 謂詞說明
cbo通過計算各種可能的執行計畫的「代價」,即cost,從中選用cost最低的執行方案作為實際執行方案;
它依賴資料庫物件的統計資訊,統計資訊的準確與否會影響cbo做出最優的選擇,也就是對資料「敏感」。
access("a"."empno"="b"."mgr")
filter("a"."empno"="b"."mgr")
filter("b"."mgr" is not null)
access: 表示這個謂詞條件的值將會影響資料的訪問路勁(表還是索引)。
filter:表示謂詞條件的值不會影響資料的訪問路勁,只起過濾的作用。
1.3 統計資訊說明
db block gets : 從buffer cache中讀取的block的數量
consistent gets: 從buffer cache中讀取的undo資料的block的數量
physical reads: 從磁碟讀取的block的數量
redo size: dml生成的redo的大小
sorts (memory) :在記憶體執行的排序量
sorts (disk) :在磁碟上執行的排序量
在看執行計畫的時候,除了看執行計畫本身,還需要看謂詞和提示資訊。 通過整體資訊來判斷sql 效率。
技巧總結:1. 同一級若沒有子id就最先執行
2. 同一級執行遵循最上最後先執行的原則
index range scan —> table access by global index rowid —> index unique scan —> table access by index rowid —> nested loops outer —> sort group by —> select statement, goal = all_rows
4.1 table access full
oracle會讀取表中所有的行,並檢查每一行是否滿足sql語句中的 where 限制條件;
全表掃瞄時可以使用多塊讀(即一次i/o讀取多塊資料塊)操作,提公升吞吐量;
使用建議:資料量太大的表不建議使用全表掃瞄,除非本身需要取出的資料較多,佔到表資料總量的 5% ~ 10% 或以上
4.2 table access by rowid
rowid是由oracle自動加在表中每行最後的一列偽列,既然是偽列,就說明表中並不會物理儲存rowid的值;
你可以像使用其它列一樣使用它,只是不能對該列的值進行增、刪、改操作;
一旦一行資料插入後,則其對應的rowid在該行的生命週期內是唯一的,即使發生行遷移,該行的rowid值也不變。
讓我們再回到 table access by rowid 來:
行的rowid指出了該行所在的資料檔案、資料塊以及行在該塊中的位置,所以通過rowid可以快速定位到目標資料上,這也是oracle中訪問單行資料最快的方法
4.3 table access by index scan
既儲存每個索引的鍵值,也儲存具有該鍵值的行的rowid
索引掃瞄步驟:
ⅰ:掃瞄索引得到對應的rowid
ⅱ:通過rowid定位到具體的行讀取資料
5.1 index unique scan(唯一掃瞄)
每次 只返回一條記錄
情景:unique primary key
5.2 index range scan(索引範圍掃瞄)
情景:索引列使用 範圍操作符 > <
組合索引,查詢部分
非唯一索引列 任何查詢
5.3 index full scan(索引全掃瞄)——查詢資料必須從索引列 全部直接得到
5.4 index fast full scan(索引快速掃瞄)——類似index full scan,但是它查詢的資料 不進行排序
5.5 index skip scan(索引跳躍掃瞄)
情景:復合索引的前導列(索引中第一列) 沒有在查詢語句**現
當oracle發現前導列的唯一值個數很少時,會將每個唯一值都作為常規掃瞄的入口,在此基礎上做一次查詢,最後合併這些查詢;
假設表emp有ename(雇員名稱)、job(職位名)、***(性別)三個字段,並且建立了如 create index idx_emp on emp (***, ename, job) 的復合索引;
因為性別只有 '男' 和 '女' 兩個值,所以為了提高索引的利用率,oracle可將這個復合索引拆成 ('男', ename, job),('女', ename, job) 這兩個復合索引;
當查詢 select * from emp where job = 'programmer' 時,該查詢發出後:
oracle先進入***為'男'的入口,這時候使用到了 ('男', ename, job) 這條復合索引,查詢 job = 'programmer' 的條目;
再進入***為'女'的入口,這時候使用到了 ('女', ename, job) 這條復合索引,查詢 job = 'programmer' 的條目;
最後合併查詢到的來自兩個入口的結果集。
mysql 查詢執行計畫 MySql執行計畫的檢視
一。什麼是資料庫執行計畫 利用乙個sql語句,你可能要server取出所有news表中的資訊.當server收到的這條sql的時候,第一件事情並不是解析它.如果這條sql沒有語法錯誤,server才會繼續工作.server會決定最好的計算方式.server會選擇,是讀整個news表好呢,還是利用索引...
用PL SQL檢視SQL語句執行計畫
一般通過很多任務具可以看pl sql的執行計畫來分析語句效能。這裡介紹通過pl sql檢視sql執行計畫的幾種方法 方法一.set autotrace on 然後當執行你的sql語句的時候,執行計畫自動顯示出來。不想看執行計畫了,set autotrace off 方法二.執行語句 explain ...
查詢處理和執行 查詢計畫
檢視查詢計畫的方式有如下幾種 1 上下文相關的選單選項 6 使用dmf select from sys.dm exec query plan plan handle select from sys.dm exec text query plan plan handle 查詢計畫操作符查詢優化器可以使...