如何查看Oracle執行計劃,並經過執行計劃優化SQL

1、查看執行計劃的方法有多種,依次以下:sql

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

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

        wKiom1iv3iXipDzTAACrHthzLpU895.png-wh_50


    二、explain plan for命令性能

        在sql*plus或者PL/SQL Developer打開的command window中,執行以下命令:測試

            1)explain plan for select * from dual;  +回車優化

            2)select * from table(dbms_xplan.display);  +回車spa

       wKioL1iv3KyxrxHTAAAdskiZvK8220.png-wh_50


2、使用執行計劃進行SQL調優blog

    一、 查看總COST,得到資源耗費的整體印象 排序

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

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

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

    三、 分析表的訪問方式 

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

    四、 分析表的鏈接方式和鏈接順序 

        表的鏈接順序:就是以哪張表做爲驅動表來鏈接其餘表的前後訪問順序。 

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

        咱們常見得是嵌套循環和哈希鏈接。 

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

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

 

    總結: 

        一、這裏看到的執行計劃,只是SQL運行前可能的執行方式,實際運行時可能由於軟硬件環境的不一樣,而有所改變,並且cost高的執行計劃,不必定在實際運行起來,速度就必定差,咱們平時須要結合執行計劃,和實際測試的運行時間,來肯定一個執行計劃的好壞。 

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

 

20120412105911790

相關文章
相關標籤/搜索