學會看Oracle的AWR報告


在官網http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html?ssSourceSiteId=otncn 下載win64_11gR2_client.zip(注意選擇正確的版本)

下載完成后,點擊setup.exe 進行安裝

如果報錯顯示“不滿足最低配置”,依次打開stage\cvu\cvu_prereq.xml,修改其中的MAX_LENGTH 值為合適的值,再重新安裝即可

如果參考Navicat Premium 連接Oracle 數據庫,從https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html下載instantclient-basic-windows.x64-11.2.0.4.0.zip、instantclient-sqlplus-windows.x64-11.2.0.4.0.zip,為Navicat 配置完成后,會缺少awrrpt.sql 等關鍵文件,所以還是下載win64_11gR2_client.zip!

打開Navicat,【工具】–>【選項】–>【OCI】,配置OCI library、SQL Plus

  • D:\APP\xum\product\11.2.0\client_1\BIN\oci.dll
  • D:\APP\xum\product\11.2.0\client_1\BIN\sqlplus.exe

配置完成后,重啟Navicat,然后在Navicat 上對應的Oracle 連接上,【右鍵】–>【命令行界面】,即可打開SQL Plus 命令行界面

如何生成AWR報告

-- 查看用戶 show parameter db_name -- 開始執行壓測后執行,生成AWR 快照 exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); -- 在這個時間段內進行壓測 -- 結束壓測后再次執行,再次生成AWR 快照 exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); -- 生成AWR報告 @?/rdbms/admin/awrrpt 

查看用戶

在執行壓測前后生成快照

@?/rdbms/admin/awrrpt,生成AWR 報告,選擇格式、天數、開始節點和結束節點(這里選擇了比較近的兩個節點,建議實際選擇跨度大一些的兩個節點,方便觀察更多細節)

輸入想要生成的報告名稱,以html 格式結尾

等待一會,生成的AWR 報告的路徑在登錄數據庫的路徑。D:\APP\xum\product\11.2.0\client_1\BIN

使用Chrome 打開之后看到的內容大概是這樣的(AWR 報告實在太長,這里截圖只展示很小的一部分)

AWR報告分析解讀

Oracle AWR性能優化一例

AWR 反應的是點對點的數據。比如說,生成一個今天9:00到12:00的AWR 報告,那么,看到的就是12:00和9:00兩個時間點的變化。但9:00-10:00、10:00-11:00、11:-12:00 分別是什么樣的,看不到

通過AWR報告分析某SQL

-- 查詢AWR 配置 select * from dba_hist_wr_control; -- 調整AWR 收集SQL 的設置,因為默認情況下AWR 並非捕獲所有SQL,此調整是為了讓AWR 收集實驗過程中的SQL -- 將topnsql 參數設置為最大值,以確保任意sql 只要執行一次即可寫入到快照 exec dbms_workload_repository.modify_snapshot_settingS(topnsql=>'MAXIMUM'); -- 開始執行壓測后執行,生成AWR 快照 exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); -- 在這個時間段內進行壓測 -- 結束壓測后再次執行,再次生成AWR 快照 exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); -- 根據關鍵字查找某個SQL,注意檢查LAST_ACTIVE_TIME 這個列的值在我們抓快照的時間段內 select * from v$sql where sql_fulltext like '%table_name%'; -- 或者 select *from v$sqlarea where sql_fulltext like '%table_name%' -- 生成某個SQL_ID 的AWR 報告 @?/rdbms/admin/awrsqrpt 

按照上面的說明,調整AWR 收集SQL 的設置

在執行壓測前后生成快照

查詢某個SQL 的信息,注意檢查LAST_ACTIVE_TIME 這個列的值在我們抓快照的時間段內

通過以上SQL 獲取某條SQL 的SQL_ID,比如8waf6k71ss7uy

@?/rdbms/admin/awrsqrpt,與生成awrrpt 類似,前面都需要選擇格式、天數、開始節點和結束節點,不同的是需要指定要生成報告的SQL_ID

  • @?/rdbms/admin/awrrpt.sql – 標准報告,特定時間段內總體性能報告
  • @?/rdbms/admin/awrddrpt.sql – 對比報告,兩個時間段內性能對比
  • @?/rdbms/admin/ashrpt.sql – ASH報告,特定時間段內歷史會話性能報告
  • @?/rdbms/admin/awrsqrpt.sql – SQL報告,特定時間段內SQL性能報告

生成html 文件,使用Chrome 打開后大概是這樣的

而且還可以在這里看到這條SQL 的執行計划的信息

MySQL/Oracle執行計划

查看執行計划的幾種方式總結

但每次都去查看AWR 報告是一件很繁瑣的事情,如果可以單獨的查看哪些有問題的SQL,就不用每次都去生成一個AWR 報告了。dba_hist_sqlstat 這個視圖記錄了每次snap_id 里面的SQL 信息

select v.sql_text, m.* from (select distinct snap_id, sql_id, executions_delta, trunc(max(elapsed_time_delta) over(partition by snap_id, sql_id) / 1000000, 0) max_elapsed, trunc((max(elapsed_time_delta) over(partition by snap_id, sql_id)) / (sum(elapsed_time_delta) over(partition by snap_id)), 2) * 100 per_total from dba_hist_sqlstat t where t.snap_id in (select max(snap_id) from dba_hist_sqlstat) )m, v$sql v where m.sql_id = v.sql_id and m.max_elapsed >= 60 

這個腳本是查找m.max_elapsed >= 60(這邊的單位是秒),也是1分鍾的時間,可以根據系統的實際情況進行定義

執行上面的SQL(改了一下條件),可以看到最后一個SQL 的耗時最長,占總體消耗的47%,顯然這個是最有必要優化的SQL!

清除緩沖池中的執行計划

按照上面的方法可以查看SQL 的AWR 報告,但是想要查看某個綁定變量的SQL,雖然是在快照期間執行的,但是發現v$sql 中的LAST_ACTIVE_TIME 沒有更新!Why?

select * from v$sql where sql_id = '11nsx249u9t10'; 

Oracle清空Shared Pool

-- 根據SQL_ID 查詢對應的執行計划信息 SELECT SQL_TEXT, SQL_ID, UTL_RAW.CAST_TO_RAW(ADDRESS), HASH_VALUE, EXECUTIONS, LOADS, PARSE_CALLS, INVALIDATIONS FROM v$sqlarea V WHERE SQL_ID = '2p8j2gvy6hbq3'; -- 07000101C773B270是ADDRESS -- 329573408是HASH_VALUE call sys.dbms_shared_pool.purge('07000101C773B270,329573408','c') 

這樣可以具體清楚Shared Pool 中的某個SQL 的執行計划,再去v$sqlarea、v$sql 中就查詢不到對應的記錄了

但是為什么再次執行SQL 之后,再去v$sqlarea 中還是查詢不到記錄呢?

MySQL 數據庫呢?

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM