PLSQL查詢執行計畫

2021-09-22 18:20:28 字數 3050 閱讀 2925

一般優化途徑:

如果能通過修改語句優化,比如查詢條件或執行順序,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 查詢計畫操作符查詢優化器可以使...