Oracle的執行計劃
得到執行計劃的方式
Autotrace例子
使用Explain
explain plan set STATEMENT_ID='testplan'
for select * from dual;
select lpad(' ',5*(level-1))||operation operation, options,
object_name, cost,position
from plan_table
start with id=0 and STATEMENT_ID='testplan'
connect by prior id=parent_id ;
怎樣看執行計劃
看懂執行計劃前先需要了解的一些知識
僞列-ROWID
Recursive SQL
Row Source and Predicate
- Row Source(行源):用在查詢中,由上一操作返回的符合條件的行的集合,即可以是表的全部行數據的集合;也可以是表的部分行數據的集合;也可以爲對上2個row source進行連接操作(如join連接)後得到的行數據集合。
- Predicate(謂詞):一個查詢中的WHERE限制條件
Driving Table
Probed Table
組合索引(concatenated index)
可選擇性(selectivity)
oracle訪問數據的存取方法(高實戰)
索引掃描的細分(Index Scan)
表連接(高實戰1)
表連接(高實戰2)
表連接(高實戰3)
表連接(高實戰4)
不同表連接的相對速度
一個簡單的執行計劃(在PLSQL-DEVELOPER裏按F5,不是F4哈)
再來看2個執行計劃(1)
再來看2個執行計劃(2)
Oracle中的Hints(提示)
優化器提示
表連接提示
索引提示
並行提示
表訪問提示
索引和SQL語句的正確使用
- 索引-參見《給PLSQL插上飛翔的翅膀-PLSQL優化》中的索引部分
- SQL語句-參見《給PLSQL插上飛翔的翅膀-PLSQL優化》中的SQL WHERE和表連接部分
使用ORACLE自帶的SQLPLUS
如何讓SQLPLUS據有AUTOTRACE功能
- 以sys用戶連接;
- 運行$ORACLE_HOME/sqlplus目錄下的plustrace.sql腳本;
- grant plustrace to public,對所有用戶有效;
- 在sql*plus 中運行set autot on命令,將自動跟蹤sql的執行計劃並提供sql統計資料;
Consistent Gets
但是爲什麼第2個SQL的consistent gets如此之少?
原因有如下兩點:
- 通常情況下,不在logical RAM buffer中的數據要通過physical reads來讀取,而physical reads後通常會緊跟着一個consistent gets。因此一般情況下consistent gets是要比physical reads大的。但是有一個特例,如果physical reads得到的數據直接用於HASH或者SORT,則只記爲physical reads不記爲consistent gets。所以加上order by後有可能physical reads多但consistent gets少。不過這個原因不是我這裏現象產生的原因,因爲我這個實驗里根本沒有physical reads。
- arraysize的影響。arraysize是指讀取數據時一次讀取得到的行數。這個值默認爲15,使用show arraysize命令可以查看。一個數據塊例如有100條記錄,那麼並不是讀取這個塊一次就能取到所有數據,以arraysize=15爲例,就要有100/15=7次consistent gets。把arraysize設置得大一點可以降低consistent gets,不過有時候可能會消耗更多的資源。如果我們做select count(0) from test;操作,那麼Oracle會把arraysize暫時設爲test的行數,因此consistent gets會很少。很少:
AUTOTRACE的幾個常用選項
set autotrace on explain
set autotrace on statistics
set autotrace traceonly
set autotrace traceonly explain
另一種查看SQL計劃的方式-Explain plan
準備:
運行$ORACLE_HOME/rdbms/admin目錄下的utlxplan.sql腳本
建立plan_table表
執行方案:explain plan for SQL