Oracle執行計劃分析

一段SQL代碼寫好以後,可以通過查看SQL的執行計劃,初步預測該SQL在運行時的性能好壞,尤其是在發現某個SQL語句的效率較差時,我們可以通過查看執行計劃,分析出該SQL代碼的問題所在。

那麼,作爲開發人員,怎麼樣比較簡單的利用執行計劃評估SQL語句的性能呢?總結如下步驟供大家參考:

1、 打開熟悉的查看工具:PL/SQL Developer。

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

2、 查看總COST,獲得資源耗費的總體印象

一般而言,執行計劃第一行所對應的COST(即成本耗費)值,反應了運行這段SQL的總體估計成本,單看這個總成本沒有實際意義,但可以拿它與相同邏輯不同執行計劃的SQL的總體COST進行比較,通常COST低的執行計劃要好一些。

3、 按照從左至右,從上至下的方法,瞭解執行計劃的執行步驟

執行計劃按照層次逐步縮進,從左至右看,縮進最多的那一步,最先執行,如果縮進量相同,則按照從上而下的方法判斷執行順序,可粗略認爲上面的步驟優先執行。每一個執行步驟都有對應的COST,可從單步COST的高低,以及單步的估計結果集(對應ROWS/基數),來分析表的訪問方式,連接順序以及連接方式是否合理。

4、 分析表的訪問方式

表的訪問方式主要是兩種:全表掃描(TABLE ACCESS FULL)和索引掃描(INDEX SCAN),如果表上存在選擇性很好的索引,卻走了全表掃描,而且是大表的全表掃描,就說明表的訪問方式可能存在問題;若大表上沒有合適的索引而走了全表掃描,就需要分析能否建立索引,或者是否能選擇更合適的表連接方式和連接順序以提高效率。

5、 分析表的連接方式和連接順序

表的連接順序:就是以哪張表作爲驅動表來連接其他表的先後訪問順序。

表的連接方式:簡單來講,就是兩個表獲得滿足條件的數據時的連接過程。主要有三種表連接方式,嵌套循環(NESTED LOOPS)、哈希連接(HASH JOIN)和排序-合併連接(SORT MERGE JOIN)。

我們常見得是嵌套循環和哈希連接。

嵌套循環:最適用也是最簡單的連接方式。類似於用兩層循環處理兩個遊標,外層遊標稱作驅動表,Oracle檢索驅動表的數據,一條一條的代入內層遊標,查找滿足WHERE條件的所有數據,因此內層遊標表中可用索引的選擇性越好,嵌套循環連接的性能就越高。

哈希連接:先將驅動表的數據按照條件字段以散列的方式放入內存,然後在內存中匹配滿足條件的行。哈希連接需要有合適的內存,而且必須在CBO優化模式下,連接兩表的WHERE條件有等號的情況下才可以使用。哈希連接在表的數據量較大,表中沒有合適的索引可用時比嵌套循環的效率要高。

總結兩點:

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

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

20120412105911790

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章