我們都知道Oracle的AWR報告是一個很強大的功能通過分析AWR報告可以打出Oracle資料運作過程中出現的問題和可能存在的隐患。但是AWR報告中沒有關于單個SQL執行計劃、統計資訊的較長的描述,但不代表AWR不能提供這種功能。
本文介紹的是如何使用AWR報告生成一條sql的詳細執行統計報告。
實驗環境11.2.0.4
1、調整AWR關于SQL收集的設定,調整的目的是因為預設情況下AWR并非捕獲所有的sql語句,此調整是為了讓AWR可以收集實驗過程中的SQL語句
<code>zx@ORCL></code><code>select</code> <code>* </code><code>from</code> <code>dba_hist_wr_control;</code>
<code> </code><code>DBID SNAP_INTERVAL RETENTION TOPNSQL</code>
<code>---------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ------------------------------</code>
<code>1444351641 +00000 01:00:00.0 +00008 00:00:00.0 </code><code>DEFAULT</code>
<code>zx@ORCL></code><code>exec</code> <code>dbms_workload_repository.modify_snapshot_settingS(topnsql=></code><code>'MAXIMUM'</code><code>);</code>
<code>PL/SQL </code><code>procedure</code> <code>successfully completed.</code>
<code>1444351641 +00000 01:00:00.0 +00008 00:00:00.0 MAXIMUM</code>
2、手工建立一個AWR快照
<code>zx@ORCL></code><code>exec</code> <code>dbms_workload_repository.create_snapshot;</code>
3、建立測試表并在不同情況下執行測試sql,并找到測試sql的sql_id
<code>zx@ORCL></code><code>create</code> <code>table</code> <code>t </code><code>as</code> <code>select</code> <code>* </code><code>from</code> <code>dba_objects;</code>
<code>Table</code> <code>created.</code>
<code>zx@ORCL></code><code>create</code> <code>unique</code> <code>index</code> <code>idx_unique_t </code><code>on</code> <code>t(object_id);</code>
<code>Index</code> <code>created.</code>
<code>zx@ORCL></code><code>exec</code> <code>dbms_stats.gather_table_stats(</code><code>USER</code><code>,</code><code>'T'</code><code>,</code><code>CASCADE</code><code>=></code><code>TRUE</code><code>);</code>
<code>zx@ORCL></code><code>select</code> <code>object_name </code><code>from</code> <code>t </code><code>where</code> <code>object_id=123;</code>
<code>OBJECT_NAME</code>
<code>------------------------------</code>
<code>ECOL$</code>
<code>zx@ORCL></code><code>select</code> <code>sql_id,sql_text </code><code>from</code> <code>v$sql </code><code>where</code> <code>sql_text=</code><code>'select object_name from t where object_id=123'</code><code>;</code>
<code>SQL_ID SQL_TEXT</code>
<code>------------------- -----------------------------------------------</code>
<code>2dymmcx3kf7h1 </code><code>select</code> <code>object_name </code><code>from</code> <code>t </code><code>where</code> <code>object_id=123</code>
4、再次手工生成AWR快照
5、使用awrsqrpt.sql腳本生成對于sql_id=2dymmcx3kf7h1的sql的詳細統計資訊。過程與生成awrrpt類似,不同的是需要指定要生成報告的sql_id
<code>zx@ORCL>@?/rdbms/admin/awrsqrpt</code>
<code>Current</code> <code>Instance</code>
<code>~~~~~~~~~~~~~~~~</code>
<code> </code><code>DB Id DB </code><code>Name</code> <code>Inst Num Instance</code>
<code>----------- ------------ -------- ------------</code>
<code> </code><code>1444351641 ORCL 1 orcl</code>
<code>Specify the Report Type</code>
<code>~~~~~~~~~~~~~~~~~~~~~~~</code>
<code>Would you </code><code>like</code> <code>an HTML report, </code><code>or</code> <code>a plain text report?</code>
<code>Enter </code><code>'html'</code> <code>for</code> <code>an HTML report, </code><code>or</code> <code>'text'</code> <code>for</code> <code>plain text</code>
<code>Defaults </code><code>to</code> <code>'html'</code>
<code>Enter value </code><code>for</code> <code>report_type: text</code>
<code>Type Specified: text</code>
<code>Instances </code><code>in</code> <code>this Workload Repository </code><code>schema</code>
<code>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
<code> </code><code>DB Id Inst Num DB </code><code>Name</code> <code>Instance Host</code>
<code>------------ -------- ------------ ------------ ------------</code>
<code>* 1444351641 1 ORCL orcl rhel6</code>
<code>Using 1444351641 </code><code>for</code> <code>database</code> <code>Id</code>
<code>Using 1 </code><code>for</code> <code>instance number</code>
<code>Specify the number </code><code>of</code> <code>days </code><code>of</code> <code>snapshots </code><code>to</code> <code>choose </code><code>from</code>
<code>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
<code>Entering the number </code><code>of</code> <code>days (n) will result </code><code>in</code> <code>the most recent</code>
<code>(n) days </code><code>of</code> <code>snapshots being listed. Pressing <</code><code>return</code><code>> without</code>
<code>specifying a number lists </code><code>all</code> <code>completed snapshots.</code>
<code>Enter value </code><code>for</code> <code>num_days: 1</code>
<code>Listing the </code><code>last</code> <code>day</code><code>'s Completed Snapshots</code>
<code> </code><code>Snap</code>
<code>Instance DB </code><code>Name</code> <code>Snap Id Snap Started </code><code>Level</code>
<code>------------ ------------ --------- ------------------ -----</code>
<code>orcl ORCL 826 15 Feb 2017 09:25 1</code>
<code> </code><code>827 15 Feb 2017 10:00 1</code>
<code> </code><code>828 15 Feb 2017 10:00 1</code>
<code> </code><code>829 15 Feb 2017 10:04 1</code>
<code> </code><code>830 15 Feb 2017 10:09 1</code>
<code> </code><code>831 15 Feb 2017 11:00 1</code>
<code> </code><code>832 15 Feb 2017 11:02 1</code>
<code> </code><code>833 15 Feb 2017 11:07 1</code>
<code>Specify the </code><code>Begin</code> <code>and</code> <code>End</code> <code>Snapshot Ids</code>
<code>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
<code>Enter value </code><code>for</code> <code>begin_snap: 832</code>
<code>Begin</code> <code>Snapshot Id specified: 832</code>
<code>Enter value </code><code>for</code> <code>end_snap: 833</code>
<code>End</code> <code>Snapshot Id specified: 833</code>
<code>Specify the SQL Id</code>
<code>~~~~~~~~~~~~~~~~~~</code>
<code>Enter value </code><code>for</code> <code>sql_id: 2dymmcx3kf7h1</code>
<code>SQL ID specified: 2dymmcx3kf7h1</code>
<code>Specify the Report </code><code>Name</code>
<code>The </code><code>default</code> <code>report file </code><code>name</code> <code>is</code> <code>awrsqlrpt_1_832_833.txt. </code><code>To</code> <code>use this </code><code>name</code><code>,</code>
<code>press <</code><code>return</code><code>> </code><code>to</code> <code>continue</code><code>, otherwise enter an alternative.</code>
<code>Enter value </code><code>for</code> <code>report_name: </code>
<code>Using the report </code><code>name</code> <code>awrsqlrpt_1_832_833.txt</code>
<code>WORKLOAD REPOSITORY SQL Report</code>
<code>Snapshot Period Summary</code>
<code>DB </code><code>Name</code> <code>DB Id Instance Inst Num Startup </code><code>Time</code> <code>Release RAC</code>
<code>------------ ----------- ------------ -------- --------------- ----------- ---</code>
<code>ORCL 1444351641 orcl 1 15-Feb-17 09:14 11.2.0.4.0 </code><code>NO</code>
<code> </code><code>Snap Id Snap </code><code>Time</code> <code>Sessions Curs/Sess</code>
<code> </code><code>--------- ------------------- -------- ---------</code>
<code>Begin</code> <code>Snap: 832 15-Feb-17 11:02:01 27 1.3</code>
<code> </code><code>End</code> <code>Snap: 833 15-Feb-17 11:07:24 29 1.5</code>
<code> </code><code>Elapsed: 5.38 (mins)</code>
<code> </code><code>DB </code><code>Time</code><code>: 0.06 (mins)</code>
<code>SQL Summary DB/Inst: ORCL/orcl Snaps: 832-833</code>
<code> </code><code>Elapsed</code>
<code> </code><code>SQL Id </code><code>Time</code> <code>(ms)</code>
<code>------------- ----------</code>
<code>2dymmcx3kf7h1 1</code>
<code>Module: SQL*Plus</code>
<code>select</code> <code>object_name </code><code>from</code> <code>t </code><code>where</code> <code>object_id=123</code>
<code> </code><code>-------------------------------------------------------------</code>
<code>SQL ID: 2dymmcx3kf7h1 DB/Inst: ORCL/orcl Snaps: 832-833</code>
<code>-> 1st Capture </code><code>and</code> <code>Last</code> <code>Capture Snap IDs</code>
<code> </code><code>refer </code><code>to</code> <code>Snapshot IDs witin the snapshot range</code>
<code>-> </code><code>select</code> <code>object_name </code><code>from</code> <code>t </code><code>where</code> <code>object_id=123</code>
<code> </code><code>Plan Hash Total Elapsed 1st Capture </code><code>Last</code> <code>Capture</code>
<code># Value </code><code>Time</code><code>(ms) Executions Snap ID Snap ID</code>
<code>--- ---------------- ---------------- ------------- ------------- --------------</code>
<code>1 3476657867 1 1 833 833</code>
<code>Plan 1(PHV: 3476657867)</code>
<code>-----------------------</code>
<code>Plan </code><code>Statistics</code> <code>DB/Inst: ORCL/orcl Snaps: 832-833</code>
<code>-> % Total DB </code><code>Time</code> <code>is</code> <code>the Elapsed </code><code>Time</code> <code>of</code> <code>the SQL statement divided</code>
<code> </code><code>into</code> <code>the Total </code><code>Database</code> <code>Time</code> <code>multiplied </code><code>by</code> <code>100</code>
<code>Stat </code><code>Name</code> <code>Statement Per Execution % Snap</code>
<code>---------------------------------------- ---------- -------------- -------</code>
<code>Elapsed </code><code>Time</code> <code>(ms) 1 0.8 0.0</code>
<code>CPU </code><code>Time</code> <code>(ms) 0 0.0 0.0</code>
<code>Executions 1 N/A N/A</code>
<code>Buffer Gets 3 3.0 0.0</code>
<code>Disk Reads 0 0.0 0.0</code>
<code>Parse Calls 1 1.0 0.1</code>
<code>Rows</code> <code>1 1.0 N/A</code>
<code>User</code> <code>I/O Wait </code><code>Time</code> <code>(ms) 0 N/A N/A</code>
<code>Cluster Wait </code><code>Time</code> <code>(ms) 0 N/A N/A</code>
<code>Application Wait </code><code>Time</code> <code>(ms) 0 N/A N/A</code>
<code>Concurrency Wait </code><code>Time</code> <code>(ms) 0 N/A N/A</code>
<code>Invalidations 0 N/A N/A</code>
<code>Version </code><code>Count</code> <code>1 N/A N/A</code>
<code>Sharable Mem(KB) 15 N/A N/A</code>
<code>Execution Plan</code>
<code>--------------------------------------------------------------------------------------------</code>
<code>| Id | Operation | </code><code>Name</code> <code>| </code><code>Rows</code> <code>| Bytes | Cost (%CPU)| </code><code>Time</code> <code>|</code>
<code>| 0 | </code><code>SELECT</code> <code>STATEMENT | | | | 2 (100)| |</code>
<code>| 1 | </code><code>TABLE</code> <code>ACCESS </code><code>BY</code> <code>INDEX</code> <code>ROWID| T | 1 | 30 | 2 (0)| 00:00:01 |</code>
<code>| 2 | </code><code>INDEX</code> <code>UNIQUE</code> <code>SCAN | IDX_UNIQUE_T | 1 | | 1 (0)| 00:00:01 |</code>
<code>Full</code> <code>SQL Text</code>
<code>SQL ID SQL Text</code>
<code>------------ -----------------------------------------------------------------</code>
<code>2dymmcx3kf7h </code><code>select</code> <code>object_name </code><code>from</code> <code>t </code><code>where</code> <code>object_id=123</code>
<code>Report written </code><code>to</code> <code>awrsqlrpt_1_832_833.txt</code>
報告中列出了AWR記錄中sql執行的統計資訊和執行計劃。
<a href="http://www.linuxidc.com/Linux/2013-01/77196.htm" target="_blank">http://www.linuxidc.com/Linux/2013-01/77196.htm</a>
<a href="http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_workload_repos.htm#ARPLS69140" target="_blank">http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_workload_repos.htm#ARPLS69140</a>
《基于Oracle的SQL優化》
本文轉自hbxztc 51CTO部落格,原文連結:http://blog.51cto.com/hbxztc/1897981,如需轉載請自行聯系原作者