標籤:http os 使用 ar 資料 sp div 問題 代碼
一段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低的執行計畫要好一些。 www.2cto.com
3、 按照從左至右,從上至下的方法,瞭解執行計畫的執行步驟 執行計畫按照層次逐步縮排,從左至右看,縮排最多的那一步,最先執行,如果縮排量相同,則按照從上而下的方法判斷執行順序,可粗略認為上面的步驟優先執行。每一個執行步驟都有對應的COST,可從單步COST的高低,以及單步的估計結果集(對應ROWS/基數),來分析表的訪問方式,串連順序以及串連方式是否合理。
4、 分析表的訪問方式 表的訪問方式主要是兩種:全表掃描(TABLE ACCESS FULL)和索引掃描(INDEX SCAN),如果表上存在選擇性很好的索引,卻走了全表掃描,而且是大表的全表掃描,就說明表的訪問方式可能存在問題;若大表上沒有合適的索引而走了全表掃描,就需要分析能否建立索引,或者是否能選擇更合適的表串連方式和串連順序以提高效率。
5、 分析表的串連方式和串連順序 表的串連順序:就是以哪張表作為驅動表來串連其他表的先後訪問順序。 表的串連方式:簡單來講,就是兩個表獲得滿足條件的資料時的串連過程。主要有三種表串連方式,嵌套迴圈(NESTED LOOPS)、雜湊串連(HASH JOIN)和排序-合并串連(SORT MERGE JOIN)。我們常見得是嵌套迴圈和雜湊串連。 嵌套迴圈:最適用也是最簡單的串連方式。類似於用兩層迴圈處理兩個遊標,外層遊標稱作驅動表,Oracle檢索驅動表的資料,一條一條的代入內層遊標,尋找滿足WHERE條件的所有資料,因此內層遊標表中可用索引的選擇性越好,嵌套迴圈串連的效能就越高。 雜湊串連:先將驅動表的資料按照條件欄位以散列的方式放入記憶體,然後在記憶體中匹配滿足條件的行。雜湊串連需要有合適的記憶體,而且必須在CBO最佳化模式下,串連兩表的WHERE條件有等號的情況下才可以使用。雜湊串連在表的資料量較大,表中沒有合適的索引可用時比嵌套迴圈的效率要高。
6、 請核心技術組協助分析 www.2cto.com 以上步驟可以協助我們初步分析SQL效能問題,如果遇到串連表太多,執行計畫過於複雜,可聯絡核心技術組共同討論,一起尋找更合適的SQL寫法或更恰當的索引建立方法 總結兩點: 1、這裡看到的執行計畫,只是SQL運行前可能的執行方式,實際運行時可能因為軟硬體環境的不同,而有所改變,而且cost高的執行計畫,不一定在實際運行起來,速度就一定差,我們平時需要結合執行計畫,和實際測試的已耗用時間,來確定一個執行計畫的好壞。 2、對於表的串連順序,多數情況下使用的是嵌套迴圈,尤其是在索引可用性好的情況下,使用嵌套迴圈式最好的,但當ORACLE發現需要訪問的資料表較大,索引的成本較高或者沒有合適的索引可用時,會考慮使用雜湊串連,以提高效率。排序合并串連的效能最差,但在存在排序需求,或者存在非等值串連無法使用雜湊串連的情況下,排序合并的效率,也可能比雜湊串連或嵌套迴圈要好。
附I:幾種主要表串連的比較
利用pl/sql執行計畫評估SQL語句的效能簡析