SQL*PLUS下使用AUTOTRACE
1.AUTOTRACE簡介
AUTOTRACE是SQL*Plus的一項功能,其作用是自動跟蹤SQL語句,爲SQL 語句生成一個 執行計劃並且提供與該語句的處理有關的統計信息。
SQL*Plus AUTOTRACE 可以用來替代 SQL Trace 使用,AUTOTRACE 的好處是不必設置跟蹤文件的格式,並且它將自動爲 SQL 語句顯示執行計劃。AUTOTRACE與執行計劃的區別是AUTOTRACE 分析和執行語句;而EXPLAIN PLAN僅分析語句,而不負責執行語句。
AUTOTRACE在SQL*PLUS下執行,使用AUTOTRACE不會產生跟蹤文件。
2.配置AUTOTRACE
(1).確保表PLAN_TABLE已經創建,如果沒有則如下創建:
(2).確保角色plustrace已經創建,如果沒有則如下創建:
3.使用AUTOTRACE
4. AUTOTRACE設置命令
序號
|
命令
|
解釋
|
1
|
SET AUTOTRACE OFF
|
此爲默認值,即關閉Autotrace
|
2
|
SET AUTOTRACE ON
|
產生結果集和解釋計劃並列出統計
|
3
|
SET AUTOTRACE ON EXPLAIN
|
顯示結果集和解釋計劃不顯示統計
|
4
|
SETAUTOTRACE TRACEONLY
|
顯示解釋計劃和統計,儘管執行該語句但將看不到結果集
|
5
|
SET AUTOTRACE TRACEONLY STATISTICS
|
只顯示統計
|
參見每個設置的現場舉例
5. AUTOTRACE STATISTICS含義
序號
|
列名
|
解釋
|
1
|
recursive call
|
遞歸調用SQL的個數;Oracle在執行這個SQL的時候,有時候會生成很多額外的SQL語句,這個就稱爲遞歸調用
|
2
|
db block gets
|
從buffer cache中讀取的block的數量
|
3
|
consistent gets
|
從buffer cache中讀取的undo數據的block的數量
|
4
|
physical reads
|
從磁盤讀取的block的數量
|
5
|
redo size
|
DML生成的redo的大小
|
6
|
sorts (memory)
|
在內存執行的排序量
|
7
|
sorts (disk)
|
在磁盤上執行的排序量,如果memory空間使用不足,是會使用disk的空間的
|
8
|
bytes sent via SQL*Net to client
|
利用sql*net傳入到client的字節數;
|
9
|
bytes received via SQL*Net from client
|
利用sql*net傳出client的字節數;
|
使用SQL調優顧問
刪除掉bigtab和smalltab上的所有索引:
既然上述語句性能很差,那麼怎麼優化呢?幸運的是Oracle提供一個工具稱爲SQL調優顧問。從Oracle 10g起,可以使用SQL調優顧問 (SQL Tuning Advisor ,STA)來獲得一個性能很差的語句的優化結果。STA的特點是簡單、智能,DBA只需要調用函數就可以給出一個性能很差的語句的優化結果,從而做到有的放矢!
使用DBMS_SQLTUNE包來創建優化任務並閱讀優化建議:
創建完成後驗證是否完成:
創建完成後驗證是否完成:
單擊該條目查看優化結果
也可以通過SQL語句來查看結果,此方法是我們最喜歡的方法:
進行優化:
優化後在使用autotrace:
優化後在使用autotrace:
結論:
項目
|
優化前
|
優化後
|
倍數
|
從持久層獲取consistent gets(從buffer cache中讀取的undo數據的block的數量)
|
21688
|
6950
|
3
|
物理讀physical reads(從磁盤讀取的block的數量)
|
21589
|
6928
|
3
|
遞歸調用recursive call
|
0
|
1
|
N/A
|
時間(毫秒)
|
2070
|
1078
|
2
|
使用STA能快速定位性能瓶頸,從而爲性能優化提供了準確的依據!
實時SQL監視
實時SQL監視(real-time SQL Monitorning)是Oracle 11g的另外一個新功能,其作用是允許用戶監視正在執行的SQL。默認情況下,當使用並行查詢、或者當SQL執行的CPU或I/O超過5秒鐘時會自動啓動。
也可以使用優化提示強制使用實時SQL監視功能,如下:
select /*+ monitor */ count(*)
from bigtab a, smalltab b
where a.object_name=b.table_name
如果要強制不使用實時SQL監視功能,則也可以使用優化提示:
select /*+ no_monitor */ count(*)
from bigtab a, smalltab b
where a.object_name=b.table_name
與實時SQL監視相關的系統視圖包括:
uV$SQL_MONITOR
uV$SQL_PLAN_MONITOR
uV$ACTIVE_SESSION_HISTORY
uV$SESSION
uV$SESSION_LONGOPS
uV$SQL
uV$SQL_PLAN
對於剛剛監視的結果,可以使用DBMS包讀取:
select dbms_sqltune.report_sql_monitor from dual;
1.實時SQL監視示例1-執行超過5秒的SQL
在OEM中查看監視結果,選擇“性能”->“其它監視鏈接”->“SQL Monitoring”:
查看具體的監視報告(圖形化):
單擊“文本報告”,則:
使用DBMS包查看監視結果:
2.實時SQL監視示例2-使用優化提示強制監視
結論:
1.實時SQL監視通過OEM查看其監視報告時,具有更好的圖形化的展示效果,因此更加直觀
2.如果監視的SQL語句發現具有全表掃描等執行計劃的特徵,或者CPU時間和I/O時間比較長,則可以與SQL調優顧問接合起來,不但能獲知性能瓶頸,而且能獲得Oracle推薦的優化策略。
3.實踐中,程序員往往不加思考的按照自己的理解和經驗編寫SQL,此舉在90%的項目中存在,從而造成項目產品投用後很快就產生各種性能瓶頸,正確的做法應該是 在準備好足夠的測試數據,並且監視每一條SQL並在開發的初始階段即 優化之。
習題
1.在對索引的限制中,關於NOT和不等於的限制在11g數據庫CBO模式下還存在嗎,爲什麼?在RBO模式下呢?
2.如果某個索引中的列具有可空屬性,則Oracle執行類似 is null時不會使用索引,其原因是什麼?
3.Oralce具有那三種訪問路徑,其中最快的兩種是什麼?
4.什麼情況下應該使用複合索引,此時使用複合索引比使用多個單個索引具有哪些優勢?
5.分別配置並使用SQL優化常用的三種工具:Autotrace、調優顧問和實時監視顧問,複習本課的舉例來加深理解。
轉載請註明私塾在線【 http://sishuok.com/forum/blogPost/list/6415.html】