高級SQL優化(三) 常用優化工具

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章