1. 程式人生 > 其它 >Oracle效能問題一般排查方法

Oracle效能問題一般排查方法

Oracle效能問題一般排查方法

翔之天空 2019-01-22 15:08:46  4306  收藏 13
分類專欄: Oracle 優化處理 Oracle trouble shooting 文章標籤: oracle效能問題排查
版權

Oracle 優化處理
同時被 2 個專欄收錄
9 篇文章0 訂閱
訂閱專欄

Oracle trouble shooting
8 篇文章0 訂閱
訂閱專欄
 

一、主機

1、cpu

cpu高 一般為邏輯讀高,不排除有些異常的邏輯讀sql

工具         描述
uptime       平均負載
vmstat       包括系統範圍的cpu平均負載
mpstat       檢視所有cpu核資訊
top 監控每個程序cpu用量 sar -u 檢視cpu資訊 pidstat 每個程序cpu用量分解 perf cpu剖析和跟蹤,效能計數分析 2、I/O I/O高 一般為物理(磁碟)讀高,可能有全表掃等 工具 描述 iostat 磁碟詳細統計資訊 iotop 按程序檢視磁碟IO的使用情況 pidstat 按程序檢視磁碟IO的使用情況 perf 動態跟蹤工具 3、記憶體 記憶體高 sga(buffer cache、share pool等) ,pga分配記憶體問題等 工具 描述 free 快取容量統計資訊 vmstat 虛擬記憶體統計資訊
top 監視每個程序的記憶體使用情況 pidstat 顯示活動程序的記憶體使用統計 pmap 檢視程序的記憶體映像資訊 sar -r 檢視記憶體 dtrace 動態跟蹤 valgrind 分析程式效能及程式中的記憶體洩露錯誤 二、資料庫 1、等待事件(當前) 1)檢視當前等待事件及數量,如果是庫問題 優化引數或調整業務邏輯等,如果是sql問題 繼續 col event for a58 select inst_id,event,count(*) from gv$session_wait where wait_class not
like 'Idle' group by inst_id, event order by 3 desc; --查詢當前執行sql SELECT b.inst_id,b.sid oracleID, b.username 登入Oracle使用者名稱, b.serial#, spid 作業系統ID, paddr, sql_text 正在執行的SQL, sql_fulltext, b.machine 計算機名, b.EVENT, 'alter system kill session '''||b.sid||','||b.serial#||''';' FROM gv$process a, gv$session b, gv$sql c WHERE a.addr = b.paddr AND b.sql_hash_value = c.hash_value and a.inst_id=1 and b.inst_id=1 and c.inst_id=1 and b.status='ACTIVE' 2)帶入等待事件,查到當前等待事件最多的sql SELECT b.inst_id,b.sid oracleID, b.username 登入Oracle使用者名稱, b.serial#, spid 作業系統ID, paddr, sql_text 正在執行的SQL, sql_fulltext, b.machine 計算機名, b.EVENT, c.SQL_ID, c.CHILD_NUMBER FROM gv$process a, gv$session b, gv$sql c WHERE a.addr = b.paddr AND b.sql_hash_value = c.hash_value and event like '%gc current request%' and a.inst_id=1 and b.inst_id=1 and c.inst_id=1 3)根據具體情況 優化此sql (1)統計資訊是否最新並且準確 --查看錶統計時間 select * from dba_tables; --收集table資訊 並行8 SQL> execute dbms_stats.gather_table_stats(ownname=>'&owner',tabname=>'&table_name',cascade=>true,DEGREE=>8,no_invalidate=>false,granularity=>'ALL',method_opt=>'for all columns size 1',estimate_percent =>dbms_stats.auto_sample_size); --分析收集schema資訊 execute dbms_stats.gather_schema_stats(ownname=>'&owner',no_invalidate=>false,granularity=>'ALL',method_opt=>'for all columns size 1',degree=>10,cascade=>TRUE,estimate_percent=>dbms_stats.auto_sample_size); (2)無索引 檢視sql中的表是否有索引,並確認是否可以用到索引 選擇性是否好 (3)隱式轉換,檢視歷史sql的執行計劃來判斷是否隱式轉換 執行計劃 select sql_id,child_number,LAST_ACTIVE_TIME from v$sql where sql_id='&sql_id'; alter session set statistics_level=ALL; col plan_table_output format A160 set linesize 300\r col plan_table_output format A160\r select * from table(dbms_xplan.DISPLAY_CURSOR('&sql_id', &child_number, 'ALL LAST')); (4)硬解析等情況 select to_char(FORCE_MATCHING_SIGNATURE) as FORCE_MATCHING_SIGNATURE, count(1) as counts from v$sql where FORCE_MATCHING_SIGNATURE > 0 and FORCE_MATCHING_SIGNATURE <> EXACT_MATCHING_SIGNATURE group by FORCE_MATCHING_SIGNATURE having count(1) > 50 order by 2 desc; select substr(sql_text,0,50),count(1) FROM v$sqlarea group by substr(sql_text,0,50) order by 2 desc; (5)其他情況等 2、等待事件(歷史) 提取awr或者ash觀察,或者直接用dba_hist_*檢視檢視如下: --檢視dba_hist_snapshot檢視檢視snap_id和時間的對應關係 select * from dba_hist_snapshot; --建立快照 exec dbms_workload_repository.create_snapshot(); --檢視等待事件的sql_id排行 col event for a50 select * from ( select event,sql_id,count(1) from dba_hist_active_sess_history t where snap_id between &snap_id_start and &snap_id_end and event is not null and sql_id is not null group by event,sql_id order by count(1) desc ) where rownum<20; ----歷史等待事件及sql with tmp as ( select t.instance_number,t.event,t.sql_id,count(1) cnt from dba_hist_active_sess_history t where t.snap_id between 7104 and 7105 and t.event like '%ITL%' and t.sql_id is not null group by instance_number,event,t.sql_id ) select t1.*,t2.sql_text from tmp t1,dba_hist_sqltext t2 where t1.sql_id = t2.sql_id order by cnt desc --檢視sql繫結變數 set linesize 400 col NAME for a10 col value_string for a70 select distinct instance_number, sql_id, name, datatype_string, last_captured, value_string from dba_hist_sqlbind t where sql_id = '&slq_id' and t.SNAP_ID between &snap_id_start and &snap_id_end and instance_number = &inst_id order by LAST_CAPTURED; -----快照時間的sql執行時間及邏輯讀物理讀的統計 SELECT T.SQL_ID, T.EXECUTIONS_DELTA EXEC_CNT, --快照時間內執行總次數 ROUND(ELAPSED_TIME_DELTA / 1000000, 2) EXEC_TIME, --快照時間內執行總時間 秒 ROUND(ELAPSED_TIME_DELTA / DECODE(T.EXECUTIONS_DELTA, 0, 1, T.EXECUTIONS_DELTA) / 1000000, 2) EXEC_PER, --快照時間內執行平均時間 秒 PARSING_SCHEMA_NAME SCHEMA, ROUND(DISK_READS_DELTA ,2) DISK_READS, ----快照時間內 磁碟讀 io高 ROUND(BUFFER_GETS_DELTA , 2) BUFFER_GETS, ----快照時間內 邏輯讀 cpu高 T1.SQL_TEXT, to_char(substr(T1.SQL_TEXT,0,80)) FROM DBA_HIST_SQLSTAT T JOIN DBA_HIST_SQLTEXT T1 ON T.SQL_ID = T1.SQL_ID WHERE T.SNAP_ID = 6825 --快照時間 AND T.PARSING_SCHEMA_NAME NOT IN ('SYS', 'SYSTEM') AND T.INSTANCE_NUMBER = 1 --節點 AND T.EXECUTIONS_DELTA >= 0 --快照時間內 sql執行總次數 ———————————————— 版權宣告:本文為CSDN博主「翔之天空」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。 原文連結:https://blog.csdn.net/fly43108622/article/details/86595006