方式:
sql前面加explain plan for
pl/dv工具快捷方式:f5按鍵;
舉例:
description:執行描述
obj own:專案擁有者
obj name:專案名
cost:oracle演算法算出的值,越高代表效能越差,消耗越長
cardinality:掃瞄行數,oracle預估的執行該sql會掃瞄的資料行數,注意是預估行數不是精準行數
bytes:掃瞄資料量大小
關注執行計畫的目的:
檢查sql執行過程,資料掃瞄方式,表連線方式,消耗資源值,以此來定位sql執行過慢出現的異常點
執行計畫主要操作目的:
想辦法優化sql降低cost值,cost是oracle通過演算法計算出的預估執行sql所需消耗的資源,cost越高,占用資源越大,執行效率也越慢
優化cost值方式:
通過分析description來分析異常點和優化異常點
description:
description中主要包含資訊:
1、表關聯方式
2、資料掃瞄方式
表關聯方式一般常見的是兩種:
1、巢狀迴圈(nested loops)
2、雜湊連線(hash join)
3、排序-合併連線(sort merge join)
由於合併連線不常見,這裡不做討論,那麼表關聯方式中,nested和hash到底使用哪乙個比較好?
答:關聯方式沒有哪一種絕對的好,根據實際情況優化關聯方式才是最正確的選擇;
nested最適用也是最簡單的連線方式。類似於用兩層迴圈處理兩個游標,外層游標稱作驅動表,oracle檢索驅動表的資料,一條一條的代入內層游標,查詢滿足where條件的所有資料,因此內層游標表中可用索引的選擇性越好,巢狀迴圈連線的效能就越高。
hash先將驅動表的資料按照條件欄位以雜湊的方式放入記憶體,然後在記憶體中匹配滿足條件的行。雜湊連線需要有合適的記憶體,而且必須在cbo優化模式下,連線兩表的where條件有等號的情況下才可以使用。雜湊連線在表的資料量較大,表中沒有合適的索引可用時比巢狀迴圈的效率要高;
簡單經驗總結,完全走索引,nested會比hash好;資料量很大的表中hash迴避nested好些;
資料掃瞄方式,常見如下:
1、index unique scan 主鍵掃瞄
2、index range scan 索引範圍掃瞄
3、index skip scan 索引跳躍掃瞄
4、index fast full scan 索引快速全掃
5、index full scan 索引全掃
6、table access full 全表掃瞄
效能從快到慢,遇到全掃,肯定要想辦法優化;
重要點(敲小黑板):
當然,全掃不是一定就慢,即使資料量很大的表;
如果開了並行,注意;開了並行;大多數都會走上全掃,這時候不一定說全掃就很慢了,關注description關注的目的是為了降低cost,開了並行cost不高的情況下全掃效能也會比較快;
那麼優化sql主要優化啥?
第一步主要優化的是掃瞄方式,選擇是否走索引,是否開啟並行等,
第二部就是選擇join的連線方式了,是left還是inner等等,根據實際情況選擇連線方式
觀察執行計畫圖:
sql執行步驟,第一步sql會在第乙個樹形結構最小點進行開始,我這個開了並行是full全掃;
接下來會跳轉到第乙個join節點,走hash或者走nested這裡就能看出,在第二個葉子執行出可以看出掃面關聯表的方式;
走完第二個分支葉子後,走到第二個葉子的關聯節點處,同時會跳往第三個葉子,同時會展示出相關關聯方式,同樣第三個葉子處也能看到資料掃瞄該錶的方式;
同理n個關聯就能看到n個關聯方式和該關聯表的掃瞄方式;
所以總結下:
看執行計畫:
目標:降低cost,提高效能
方式:關注description執行描述,
通過具體問題可以選擇不同方式,例如:
1、新增索引
2、優化關聯方式
3、開啟並行
4、新增更多where條件縮小資料集範圍等等
最後,說一下並行,並行是不是一定開了最好?
答:不一定,因為開了並行,大多數會走全掃,這時候如果sql本身是走高效能索引的情況下開並行,反而會影響sql的執行效率;在走全掃的情況下開啟並行能提高sql執行效率,所以建議在開啟並行前先看看開與不開的執行計畫再決定是否要開啟並行;
如何查詢oracle執行計畫 總結
第一種 explain plan命令 plsql devoloper中的f5鍵在內部也是呼叫的此命令 用法 依次執行以下語句 explain plan for 目標sql select from table dbms xplan.display 第二種 使用dbms xplan包 1 select ...
ocacle 執行計畫 Oracle執行計畫
一 什麼是oracle執行計畫?執行計畫是一條查詢語句在oracle中的執行過程或訪問路徑的描述 二 怎樣檢視oracle執行計畫?因為我一直用的plsql遠端連線的公司資料庫,所以這裡以plsql為例 配置執行計畫需要顯示的項 工具 首選項 視窗型別 計畫視窗 根據需要配置要顯示在執行計畫中的列 ...
oracle執行計畫
對於一條sql語句,oracle是如何執行的,首先必須發揮你的想象,你認為它會如何去實現。是等子查詢結果全出來之後,還是子查詢每齣乙個結果,都觸發父節點去執行。沒錯,單純的 資料瀏覽當然不用等子查詢全部結束後,但涉及到排序,求和等需求的時候,就必須要等了,你可以幫它想想,全部資料不出來的話,何談去排...