在官網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 反應的是點對點的數據。比如說,生成一個今天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 的執行計划的信息
但每次都去查看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 數據庫呢?
參考資料
- ORACLE調優深入理解AWR報告
- oracle中如何生成awr報告
- Navicat Premium 連接Oracle 數據庫
- oracle11G AWR使用及分析
- AWR報告分析解讀
- 使用AWR生成一條sql的執行統計報告
- Oracle AWR 闕值影響歷史執行計划
- 如何查找sql運行的次數、涉及的記錄行數、綁定變量的值等
- Oracle –獲取綁定變量的值
- 根據awr報告查看最慢的sql語句
- 【雲和恩墨大講堂】SQL玩轉AWR裸數據
- 深入理解JAVA虛擬機之JVM調優長篇
- MySQL/Oracle數據庫優化總結(非常全面)
- 多庫多事務降低數據不一致概率
- 巧用CAS解決數據一致性問題
- CAS下ABA問題及優化方案
- 庫存扣多了,到底怎么整
- 庫存扣減還有這么多方案?
- 淺談CAS在分布式ID生成方案上的應用
- OGG同步Oracle到Kafka(Kafka Connect Handler)
- OGG 從Oracle備庫同步數據至kafka
- Oracle 11g如何清除share pool中某條SQL的執行計划
- 使用dbms_shared_pool.purge清除共享池中的SQL執行計划
- 查看執行計划的幾種方式總結
- Oracle AWR性能優化一例
- Oracle內存結構:SGA PGA UGA