一段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條件有等號的情況下才可以使用。雜湊連線在表的資料量較大,表中沒有合適的索引可用時比巢狀迴圈的效率要高。
總結兩點:
1、這裡看到的執行計畫,只是sql執行前可能的執行方式,實際執行時可能因為軟硬體環境的不同,而有所改變,而且cost高的執行計畫,不一定在實際執行起來,速度就一定差,我們平時需要結合執行計畫,和實際測試的執行時間,來確定乙個執行計畫的好壞。
2、對於表的連線順序,多數情況下使用的是巢狀迴圈,尤其是在索引可用性好的情況下,使用巢狀迴圈式最好的,但當oracle發現需要訪問的資料表較大,索引的成本較高或者沒有合適的索引可用時,會考慮使用雜湊連線,以提高效率。排序合併連線的效能最差,但在存在排序需求,或者存在非等值連線無法使用雜湊連線的情況下,排序合併的效率,也可能比雜湊連線或巢狀迴圈要好。
附i:幾種主要表連線的比較
利用pl sql執行計畫評估SQL語句的效能簡析
一段sql 寫好以後,可以通過檢視sql的執行計畫,初步 該sql在執行時的效能好壞,尤其是在發現某個sql語句的效率較差時,我們可以通過檢視執行計畫,分析出該sql 的問題所在。1 開啟熟悉的檢視工具 pl sql developer。在pl sql developer中寫好一段sql 後,按f5...
PLSQL查詢執行計畫
一般優化途徑 如果能通過修改語句優化,比如查詢條件或執行順序,sql改不了,可以通過增加索引來解決,增加索引還不行,那就要考慮實現方式是否有問題了 一段sql 寫好以後,可以通過檢視sql的執行計畫,初步 該sql在執行時的效能好壞,尤其是在發現某個sql語句的效率較差時,我們可以通過檢視執行計畫,...
用PL SQL檢視SQL語句執行計畫
一般通過很多任務具可以看pl sql的執行計畫來分析語句效能。這裡介紹通過pl sql檢視sql執行計畫的幾種方法 方法一.set autotrace on 然後當執行你的sql語句的時候,執行計畫自動顯示出來。不想看執行計畫了,set autotrace off 方法二.執行語句 explain ...