天天看點

PLSQL_性能優化系列15_Oracle Explain Plan解析計劃解讀

2014-12-19 Created By BaoXinjian

一、摘要

在SQL語句的執行計劃中,包含很多字段項和很多子產品,其不同字段代表了不同的含義且在不同的情形下某些字段、子產品顯示或不顯示,下

面的描述給出了執行計劃中各字段的含義以及各子產品的描述。

二、執行計劃分析過程

1. 分析解析計劃

Step1. 打開熟悉的檢視工具:PL/SQL Developer - Toad。

在PL/SQL Developer中寫好一段SQL代碼後,按F5,PL/SQL Developer會自動打開執行計劃視窗,顯示該SQL的執行計劃。

Step2. 檢視總COST,獲得資源耗費的總體印象

 一般而言,執行計劃第一行所對應的COST(即成本耗費)值,反應了運作這段SQL的總體估計成本,單看這個總成本沒有實際意義,

但可以拿它與相同邏輯不 同執行計劃的SQL的總體COST進行比較,通常COST低的執行計劃要好一些。  

Step3. 按照從左至右,從上至下的方法,了解執行計劃的執行步驟

執行計劃按照層次逐漸縮進,從左至右看,縮進最多的那一步,最先執行,如果縮進量相同,則按照從上而下的方法判斷執行順序,可粗略認為上面的步驟優先執行。

每一個執行步驟都有對應的COST,可從單步COST的高低,以及單步的估計結果集(對應ROWS/基數),來分析表的通路方式,連接配接順序以及連接配接方式是 否合理。

Step4. 分析表的通路方式

表的通路方式主要是兩種:

全表掃描(TABLE ACCESS FULL)和索引掃描(INDEX SCAN),如果表上存在選擇性很好的索引,卻走了全表掃描,而且是大表的全表掃描,就說明表的通路方式可能存在問題;

若大表上沒有合适的索引而走了全表 掃描,就需要分析能否建立索引,或者是否能選擇更合适的表連接配接方式和連接配接順序以提高效率。

Step5. 分析表的連接配接方式和連接配接順序

表的連接配接順序:就是以哪張表作為驅動表來連接配接其他表的先後通路順序。

表的連接配接方式:簡單來講,就是兩個表獲得滿足條件的資料時的連接配接過程。

主要有三種表連接配接方式,嵌套循環(NESTED LOOPS)、哈希連接配接(HASH JOIN)和排序-合并連接配接(SORT MERGE JOIN)。我們常見得是嵌套循環和哈希連接配接。

嵌套循環:

最适用也是最簡單的連接配接方式。類似于用兩層循環處理兩個遊标,外層遊标稱作驅動表,Oracle檢索驅動表的資料,一條一條的代入内層遊标,查找滿足WHERE條件的所有資料,是以内層遊标表中可用索引的選擇性越好,嵌套循環連接配接的性能就越高。

哈希連接配接:

先将驅動表的資料按照條件字段以散列的方式放入記憶體,然後在記憶體中比對滿足條件的行。

哈希連接配接需要有合适的記憶體,而且必須在CBO優化模式下,連接配接兩表的WHERE條件有等号的情況下才可以使用。哈希連接配接在表的資料量較大,表中沒有合适的索引可用時比嵌套循環的效率要高。

2. 總結兩點:

2.1 這裡看到的執行計劃,隻是SQL運作前可能的執行方式,實際運作時可能因為軟硬體環境的不同,而有所改變,而且cost高的執行計劃,不一定在實際運作起來,速度就一定差,我們平時需要結合執行計劃,和實際測試的運作時間,來确定一個執行計劃的好壞。

2.2 對于表的連接配接順序,多數情況下使用的是嵌套循環,尤其是在索引可用性好的情況下,使用嵌套循環式最好的,但當ORACLE發現需要通路的資料表較大,索引 的成本較高或者沒有合适的索引可用時,會考慮使用哈希連接配接,以提高效率。排序合并連接配接的性能最差,但在存在排序需求,或者存在非等值連接配接無法使用哈希連接配接 的情況下,排序合并的效率,也可能比哈希連接配接或嵌套循環要好。

三、執行計劃中各字段的描述

1. 基本字段(總是可用的)

Id            執行計劃中每一個操作(行)的辨別符。如果數字前面帶有星号,意味着将在随後提供這行包含的謂詞資訊

Operation  對應執行的操作。也叫行源操作

Name        操作的對象名稱

2. 查詢優化器評估資訊

Rows(E-Rows)     預估操作傳回的記錄條數

Bytes(E-Bytes)    預估操作傳回的記錄位元組數

TempSpc            預估操作使用臨時表空間的大小

Cost(%CPU)        預估操作所需的開銷。在括号中列出了CPU開銷的百分比。注意這些值是通過執行計劃計算出來的。換句話說,父操作的開銷包含子操作的開銷

Time                  預估執行操作所需要的時間(HH:MM:SS)

3. 分區(僅當通路分區表時下列字段可見)

Pstart   通路的第一個分區。如果解析時不知道是哪個分區就設為KEY,KEY(I),KEY(MC),KEY(OR),KEY(SQ)

Pstop    通路的最後一個分區。如果解析時不知道是哪個分區就設為KEY,KEY(I),KEY(MC),KEY(OR),KEY(SQ)

4. 并行和分布式處理(僅當使用并行或分布式操作時下列字段可見)

Inst         在分布式操作中,指操作使用的資料庫連結的名字

TQ          在并行操作中,用于從屬線程間通信的表隊列

IN-OUT    并行或分布式操作間的關系

PQ Distrib 在并行操作中,生産者為發送資料給消費者進行的配置設定

5. 運作時統計(當設定參數statistics_level為all或使用gather_plan_statistics提示時,下列字段可見)

Starts       指定操作執行的次數

A-Rows     操作傳回的真實記錄數

A-Time     操作執行的真實時間(HH:MM:SS.FF)

6. I/O 統計(當設定參數statistics_level為all或使用gather_plan_statistics提示時,下列字段可見)

Buffers     執行期間進行的邏輯讀操作數量

Reads      執行期間進行的實體讀操作數量

Writes      執行期間進行的實體寫操作數量         

7. 記憶體使用統計

OMem        最優執行所需記憶體的預估值

1Mem        一次通過(one-pass)執行所需記憶體的預估值

0/1/M        最優/一次通過/多次通過(multipass)模式操作執行的次數

Used-Mem  最後一次執行時操作使用的記憶體量

Used-Tmp  最後一次執行時操作使用的臨時空間大小。這個字段必須擴大1024倍才能和其他衡量記憶體的字段一緻(比如,32k意味着32MB)

Max-Tmp   操作使用的最大臨時空間大小。這個字段必須擴大1024倍才能和其他衡量記憶體的字段一緻(比如,32k意味着32MB)

四、執行計劃中各子產品的描述與舉例

1. 執行前,系統預估解析計劃,Explain Plan

2. 執行後,系統實際解析計劃,Explain Plan

Thank and Regards

轉載:樂沙彌 - http://blog.csdn.net/leshami/article/details/6860007

<b>ERP技術讨論群: 288307890</b>

<b>技術交流,技術讨論,歡迎加入</b>

<b>Technology Blog Created By Oracle ERP - 鮑建立</b>