天天看點

使用AWR生成一條sql的執行統計報告

我們都知道Oracle的AWR報告是一個很強大的功能通過分析AWR報告可以打出Oracle資料運作過程中出現的問題和可能存在的隐患。但是AWR報告中沒有關于單個SQL執行計劃、統計資訊的較長的描述,但不代表AWR不能提供這種功能。

本文介紹的是如何使用AWR報告生成一條sql的詳細執行統計報告。

實驗環境11.2.0.4

1、調整AWR關于SQL收集的設定,調整的目的是因為預設情況下AWR并非捕獲所有的sql語句,此調整是為了讓AWR可以收集實驗過程中的SQL語句

<code>zx@ORCL&gt;</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&gt;</code><code>exec</code> <code>dbms_workload_repository.modify_snapshot_settingS(topnsql=&gt;</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&gt;</code><code>exec</code> <code>dbms_workload_repository.create_snapshot;</code>

3、建立測試表并在不同情況下執行測試sql,并找到測試sql的sql_id

<code>zx@ORCL&gt;</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&gt;</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&gt;</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>=&gt;</code><code>TRUE</code><code>);</code>

<code>zx@ORCL&gt;</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&gt;</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&gt;@?/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 &lt;</code><code>return</code><code>&gt; 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 &lt;</code><code>return</code><code>&gt; </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>-&gt; 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>-&gt; </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>-&gt; % 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,如需轉載請自行聯系原作者