SQL性能優化跟蹤以及分析

SQL性能優化跟蹤以及分析

【1】在未執行SQL的時候,應該先對SQL進行預先分析,通常分析是看執行計劃(查看是否走索引,驅動表的鏈接方式等),查看執行計劃方式:
①:SQL Development 的F5鍵
②:explain plan for select from xxx where xxx;
select
from table(dbms_xplan.display);
其中①等價於②,是優化器經過讀取數據字典的統計信息作出最佳的執行方法。html

【2】若是要獲取SQL執行的全部分析結果(分析時間,執行時間,邏輯讀等),可已經過如下幾種方法:sql

o SET AUOTRACE數據庫

SET AUOTRACE 詳細用法以下:緩存

https://blog.csdn.net/seven_tt/article/details/3409141 性能優化

o alter session set events '10046 trace name context forever, level 12' ;服務器

o DBMS_XPLAN.DISPLAY_COURSOR /DBMS_XPLAN.DISPLAY_AWRsession

o 查詢V$SQL_PLANoracle

【3】[重要]若是以爲系統執行效率比較低,一個比較好的方法是經過跟蹤用戶的會話而且使用tkprof工具使用排序功能格式化輸出,從而找出有問題的SQL語句。
例如首先從os上利用top命令找到當前佔用cpu資源最高的一個進程的PID號9999;
而後在數據庫中根據PID號找到相應的sid和serial#
select s.sid,s.serial# from v$session s,v$process p where s.paddr=p.addr and p.spid='9999';
而後經過exec dbms_monitor.session_trace_enable(sid,serial#)開啓trace;
最後利用tkprof察看trace輸出。
開啓Trace文件輸出
能夠經過如下方法開啓Trace文件輸出(須要ALTER SESSION系統權限):
1) alter session/system set sql_trace=true; (當前會話)
2) exec dbms_monitor.session_trace_enable
3) alter session set events '10046 trace name context forever, level 12' ;
{ --多條sql等級爲level12的信息輸出到trac文件中}ide

收集一段時間後,記得關閉trace,由於消耗性能。
exec dbms_monitor.session_trace_disable(sid,serial#);
alter session set events '10046 trace name context off';工具

---這裏涉及oracle dump轉儲知識,能夠參考如下資料:
https://www.cnblogs.com/einyboy/archive/2012/06/26/2563838.html

Trace文件的位置
· 若是使用專用服務器鏈接,會在USER_DUMP_DEST參數指定的目錄中生成跟蹤文件。
· 若是使用共享服務器鏈接,則在BACKGROUND_DUMP_DEST參數指定的目錄中生成跟蹤文件。
關於專用服務器/共享服務器->http://blog.csdn.net/fw0124/article/details/6898693

可使用參數TRACEFILE_IDENTIFIER,爲跟蹤文件名增長一個能夠唯一標識的串。例如:
alter session set tracefile_identifier='my_trace_file';
這樣,生成的Trace文件名就會以my_trace_file.trc結尾。

共享服務器模式下,或者須要跟蹤某些特定客戶端,可使用DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE。方法是:
a) sqlplus登錄,exec DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('mytest');
這裏mytest是客戶端標示符。
能夠經過select from DBA_ENABLED_TRACES;查看當前的活動trace。
b) 須要被跟蹤的客戶端鏈接執行exec DBMS_SESSION.SET_IDENTIFIER ('mytest');
c) 不須要跟蹤的時候能夠sqlplus登錄,執行exec DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE('mytest');
d) 到USER_DUMP_DEST目錄下執行trcsess output=mytest_trc.txt clientid=mytest,會自動合併各個會話的trace文件,生成mytest_trc.txt
e) 利用tkprof來生成分析報告。

利用tkprof工具分析Trace文件
能夠利用tkprof工具分析Trace文件,產生一個更加清晰合理的輸出結果。tkprof能夠在$ORACLE_HOME/bin下面找到。

1)命令格式
命令格式爲:
tkprof tracefile outputfile [explain= ] [table= ] [print= ] [insert= ] [sys= ] [sort= ]
參數說明:
tracefile:要分析的trace文件
outputfile:格式化後的文件
explain=user/password@connectstring
table=schema.tablename
上述兩個參數是一塊兒使用的,explain指示tkprof要爲在跟蹤文件中找到的每一個SQL語句提供一個執行計劃。
這是經過執行SQL語句EXPLAIN PLAN經過鏈接數據庫對在trace文件中出現的每條sql語句查看執行計劃,並將之輸出到outputfile中。
指定的table名將提供給EXPLAIN PLAN語句。
print=n:只列出最初N個sql執行語句,默認是無限制的,只有在和參數sort一塊兒使用的時候纔有意義
insert=filename:會產生一個sql文件,運行此文件可將收集到的數據insert到數據庫表中
sys=no:sys用戶運行的SQL語句(例如,解析操做階段對數據字典的遞歸查詢)不輸出到輸出文件中。
record=filename:可將非嵌套執行的sql語句過濾到指定的文件中去
waits=yes|no:是否統計任何等待事件,默認是yes
aggregate=yes|no:是否將相同sql語句的執行信息合計起來,默認爲yes
sort= option:設置排序選項,能夠用逗號分隔多個選項。默認是跟蹤文件中發現的SQL順序。具體選項能夠查看tkprof的命令幫助輸出獲得。

例如:
tkprof <tracefile> <outputfile> sys=no sort=prsela,exeela,fchela
prsela elapsed time parsing
exeela elapsed time executing
fchela elapsed time fetching

2)輸出結果格式
輸出結果中,首先是頭部內容。
以後針對每一個SQL語句提供以下信息:SQL 語句文本、執行統計、關於解析的信息、執行計劃以及等待事件。
執行計劃以及等待事件是可選的,只有存儲在跟蹤文件中才會出現。
例以下面的輸出:


SQL ID: 0c07h414zr55p
Plan Hash: 1968341081
update emp set sal=2451
where
empno=7782

call count cpu elapsed disk query current rows


Parse 2 0.01 0.00 0 0 0 0
Execute 2 0.00 3.71 0 3 7 2
Fetch 0 0.00 0.00 0 0 0 0


total 4 0.01 3.72 0 3 7 2

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 86 (TONY)

Rows Row Source Operation


0  UPDATE  EMP (cr=1 pr=0 pw=0 time=0 us)
  1   INDEX UNIQUE SCAN EMP_PK (cr=1 pr=0 pw=0 time=0 us cost=0 size=26 card=1)(object id 73464)

Rows Execution Plan


0  UPDATE STATEMENT   MODE: ALL_ROWS
  0   UPDATE OF 'EMP'
  1    INDEX   MODE: ANALYZED (UNIQUE SCAN) OF 'EMP_PK' (INDEX 
           (UNIQUE))

執行統計有以下的幾列:
count:表示執行的數據庫調用數量。
cpu:表示處理數據調用花去的CPU時間,以秒爲單位。
elapsed:是處理數據庫調用花費的總的時間,以秒爲單位,若是這個值比CPU時間高,下一節關於執行統計中的等待事件會提供在等待的資源或同步點。
disk:表示物理讀的數據塊數量。要小心,這不是物理I/O操做的數量,物理I/O操做數在關於等待事件一節給出。若是這個值大於邏輯讀的數量(disk > query +current),這意味着數據塊填充進了臨時表空間。
query:是在一致性模式(consistent mode)下從高速緩存邏輯讀取的塊數量。一般,這類型的邏輯讀用做查詢。
current:表明在當前模式下從高速緩存邏輯讀取的塊數量。一般,這類邏輯讀被INSERT、DELETE、MERGE以及UPDATE等語句所使用。
rows:表明處理的數據行數量。對於查詢來講,這就是獲取的行數量。對於INSERT、DELETE、MERGE以及UPDATE 等語句來講,這是所影響的行數量。

關於解析的信息開始兩行Misses in library cache during parse和Misses in library cache during execute提供了發生在解析和執行調用階段的硬解析數量。
若是在執行調用時沒有硬解析發生,Misses in library cache during execute這一行將不存在。
接下來是優化器模式以及用於解析SQL語句的用戶。

執行計劃分爲兩部分,第一部分稱爲行源操做(Row Source Operation ),是遊標關閉且開啓跟蹤狀況下寫到跟蹤文件中的執行計劃。這意味着若是應用程序不關閉遊標而重用它們的話,不會有新的針對重用遊標的執行計劃寫入到跟蹤文件中。第二部分,叫作執行計劃 (Execution Plan),是由指定了explain參數的TKPROF生成的。既然這是隨後生成的,因此和第一部分不必定徹底匹配。萬一你看到不一致,前者是正確的。
兩個執行計劃都經過Rows列提供執行計劃中每一個操做返回的行數(不是處理的--要注意)。
對於每一個行源操做來講,可能還會提供以下的運行時統計:
cr是一致性模式下邏輯讀出的數據塊數。
pr是從磁盤物理讀出的數據塊數。
pw是物理寫入磁盤的數據塊數。
time是以微秒錶示的總的消逝時間。要注意根據統計獲得的值不老是精確的。實際上,爲了減小開銷,可能用了採樣。
cost是操做的評估開銷。這個值只有在Oracle 11g才提供。
size是操做返回的預估數據量(字節數)。這個值只有在Oracle 11g才提供。
card是操做返回的預估行數。這個值只有在Oracle 11g才提供。

輸出文件的結尾給出了全部關於跟蹤文件的信息。首先能夠看到跟蹤文件名稱、版本號、用於這個分析所使用的參數sort的值。而後,給出了全部會話數量與SQL語句數量。

相關文章
相關標籤/搜索