一.如何查看PLSQL的執行計划
在SQl Window窗口輸入sql語句,然后按鍵"F5",就會進入執行計划查看界面。

二.界面說明
首先我們看第二行有幾個屬性可以選“Tree”、“HTML”、“Text”、“XML”。這幾個里面的核心數據是一樣的,不同的只是對核心數據的展示方式,分別為Tree、HTML、Text、XML。這個可以根據個人習慣來進行選擇。
再下面有幾個列屬性(每個人的列屬性可能會不同,這個是可以在PLSQL中進行配置)
我們首先看第一列的Description:下面的內容分別是我們這條SQL的執行步驟,縮進量最多的步驟最先執行,如果縮進量相同,則按照從上往下的順序執行。
Object owner:對象的所有者。
Object name:對象名稱。
Cost:成本花費。這里可以詳細地查看SQL執行的每一步的成本花費。
Time:執行時間。
三.如何優化SQL
1.查看SQL是全表掃描還是利用索引查詢。
假設有一張表t_srhs_jks,里面有1000萬條數據,我們在這張表中執行一條SQL:

我們可以看到根據條件dtnm=****查詢數據,由於DTNM字段不是索引,因此首先執行了"TABLE ACCESS FULL",即全表搜索,然后再執行上面的"SELECT STATEMENT, GOAL = ALL ROWS"查詢出所有數據行。
在這條SQL中的成本花費一共是14287(Cost=14287),執行時間是172(Time=172)。
然后我們對dtnm字段添加索引后再執行這條SQL:

相比第一次執行,這里的成本花費只有5385,執行時間只有65,減少了將近一倍。
然后我們再來查看一下Description下的執行步驟:
(1)INDEX RANGE SCAN:索引范圍內查找。
(2)TABLE ACCESS BY INDEX ROWID:根據索引找到的ROWID來查找需要的數據。
(3)SELECT STATEMENT,GOAL = ALL ROWS:根據找到的數據,返回所有行。
關於索引的掃描類型:
1)index unique scan:索引唯一掃描。
單列唯一索引:通過"="判斷條件時候才會使用,至多返回一條數據。
多列唯一索引:所有的列都通過"="判斷條件時才會使用,且不能有任何一列的值被指定為null。
2)index range scan:索引范圍掃描。
單列唯一索引:通過">"、"<"、">="、"<="、"between"等判斷條件時會被使用。
多列唯一索引:全部或部分列(必須包含第一列,否則不會走這條索引)通過">"、"<"、">="、"<="、"between"等判斷條件時會被使用。部分列也可以在通過"="判斷條件時候被使用。
普通索引:單列索引正常的條件判讀都會使用范圍掃描,多列的索引必須帶有第一列索引的條件判斷才會被使用范圍掃描。
3)index skip scan:索引跳躍掃描。
只有當組合索引,且引導列(第一列)沒有被使用的情況下,可能會使用索引跳躍掃描。一般發生在引導列的distinct值很少的情況下。oracle幫我們改寫了sql語句,如select * from A where b=100,組合索引(a,b)中a的取值只有1和2時,sql會被改寫為select * from A where a = 1 and b = 100 union all select * from A where a = 2 and b = 100。
4)index full scan:索引全掃描。
這一個和索引快速掃描異曲同工。通常是在使用索引列進行count、sum等函數統計時候使用。
5)index fast full scan:索引快速掃描。
關於索引,有以下幾種情況時候不會被使用(只針對數據字段查詢,不包括count、sum等函數統計):
1)'%'被添加在參數前面。

2)帶'not'的條件,包括'<>'、'!='。

3)執行函數(函數索引除外。如果定義的是函數索引,即使使用函數仍然是可能會走索引。)

4)格式不正確(下圖的jksbh字段是vchar類型,令它與number類型比較,不會走索引。)

5)使用null判斷
記錄一下PLSQL12的一個注冊碼
PLSQL Developer 12 注冊碼
product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le
serial Number:226959
password: xs374ca
