oracle 性能優化 02_OWI及性能視圖

1、oracle等待接口
    OWI (ORACLE WAIT INTERFACE),從Oracle 7開始支持OWI,目的是讓開發人員和維護人員可以了
解在Oracle的每一個模塊和OS中消耗了多少時間,經過Oracle提供的視圖獲取這些信息,是AWR,STATSPACK
等時間模型性能報告的基礎,方便找到性能問題的根源,診斷系統故障。
一、核心視圖
v$system_event     
    記錄自實例啓動以來各個等待事件的歸納信息。經常使用於獲取系統等待信息的歷史影象。而經過兩個
snapshot獲取等待項增量,肯定這段時間內系統的等待項。
v$session_event
    記錄session自啓動以來全部的等待事件。
v$session_wait  
    會話等待事件明細信息,每三秒鐘刷新一次等待時間
V$SESSION_WAIT_HISTORY  
    是對V$SESSION_WAIT的簡單加強,記錄活動SESSION的最近10次等待。
主要字段解釋:
    event:事件名稱
    total_waits: 自從實例啓動以來的等待次數
    total_timeouts: 事件被喚醒的總次數
    time_waited: 按照cs統計的總的等待時間
    average_wait: 平均每次等待的等待時間,單位是cs
    SID: SESSION ID
    seq#: 等待次數統計
    p[1-3]: 等待的詳細參數
    p[1-3]raw: 參數的raw模式
    p[1-3]text: 參數的名字
查詢當前會話的SID
    select * from v$mystat where rownum<2; #須要訪問權限
    select userenv('sid') from dual; #沒有權限要求
v$system_wait_class
    系統等待事件分類統計信息
v$session_wait_class;
    會話等待事件分類統計信息
v$sys_time_model
    系統時間統計模型
V$SESS_TIME_MODEL
    會話對應的時間統計模型
v$osstat
    操做系通通計信息
v$waitstat
    保存自實例啓動全部的等待事件統計信息。
v$filestat
    記錄文件的IO信息
v$latch
    記錄閂鎖信息
二、等待事件分類
    IDLE #空閒
    APPLICATION #行鎖、表鎖、DDL鎖等
    Configuration #因爲配置致使的
    Administrative #特權用戶的某些維護操做致使的
    Concurrency #因爲併發量大引發的
    commit #log file sync
    Network
    User I/O waits #前臺進程,SMON,MMON
    System I/O Waits #除了SMON,MMON外的後臺進程
    Scheduler #資源管理引發的
    CLUSTER #RAC
    Other
三、OWI診斷方法及過程
    經過查詢等待接口核心視圖或者生產statpack/AWR報告,找到較大等待時間和次數的等待事件,針對具體
的等待時間,細緻跟蹤分析。
    診斷過程:OS性能狀態及開銷->alert log->查詢OWI視圖或生成報告->命中率->參數調優->TOP SQL->查找
具體SQL進行SQL調優->事件跟蹤...sql

四、OWI相關的SQL語句
4.1. 監控事例的等待 
    select  event,sum(decode(wait_Time,0,0,1)) "Last wait",sum(decode(wait_Time,0,1,0)) "Current waiting", 
    count(*) "Tot"   from  v$session_Wait   group by event   order by 4; 
4.2. 回滾段的爭用狀況 
    select name, waits, gets, waits/gets "Ratio"  
    from  v$rollstat a, v$rollname b  where  a.usn = b.usn;  
4.3. 監控表空間的 I/O 讀寫狀況 
    select df.tablespace_name name,df.file_name "file",f.phyrds,f.phyblkrd,f.phywrts, f.phyblkwrt 
    from   v$filestat f, dba_data_files df  where  f.file# = df.file_id 
    order  by df.tablespace_name; 
4.4. 監控數據文件的 I/O 狀況
    select  substr(a.file#,1,2) "#", substr(a.name,1,30) "Name",  a.status, a.bytes, b.phyrds, 
    b.phywrts,b.phyblkrd,b.phyblkwrt,b.readtim,b.writetim
    from  v$datafile a, v$filestat b  where  a.file# = b.file#;  
4.5. 查找找全部的索引 
    select b.table_name, b.index_name,  uniqueness, column_name 
    from   user_ind_columns a, user_indexes  b
    where  a.index_name = b.index_name and a.table_name = b.table_name  
    order by b.table_type, b.table_name, b.index_name, column_position; 
4.6. 監控 SGA 中字典緩衝區的命中率 
    select   parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio", 
    (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio" 
    from  v$rowcache where  gets+getmisses <>0  group by parameter, gets, getmisses;  
4.7. 監控 SGA 中共享緩存區的命中率,應該小於1% 
    select  sum(pins) "Total Pins", sum(reloads) "Total Reloads", 
    sum(pinhits-reloads)/sum(pins) "hit radio",  sum(reloads)/sum(pins) *100 "reload percent" 
    from  v$librarycache; 
4.8. 顯示全部數據庫對象的類別和大小 
    select   type, count(name) object_nums, sum(source_size) source_size, 
    sum(parsed_size) parsed_size, sum(code_size) code_size, sum(error_size) error_size, 
    sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required  
    from  dba_object_size  group by type  order by 1;  
4.9.  監控內存和硬盤的排序比率,
    SELECT  name, value   FROM  v$sysstat  
    WHERE  name IN ('sorts (memory)', 'sorts (disk)');  
4.10. 監控當前數據庫誰在運行什麼SQL語句 
    SELECT   osuser, username, sql_text from  v$session a, v$sqltext b 
    where  a.sql_address =b.address order by address, piece; 
4.11. 碎片程度 
    select   tablespace_name,count(tablespace_name)  
    from  dba_free_space  group by tablespace_name  having count(tablespace_name)>10; 
    alter tablespace name coalesce; #當pctincrease=0 時候合併相鄰的空閒extent
    alter table name deallocate unused; #釋放高HWM以上的空塊 
4.十二、查看碎片程度高的表 
    SELECT   segment_name table_name , COUNT(*) extents  FROM  dba_segments  
    WHERE  owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name 
    HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM dba_segments 
    GROUP BY segment_name);                                                    數據庫

相關文章
相關標籤/搜索