Data Dictionary den ASH bilgisini alma
- ASH bilgilerini almak için kullanabileceğiniz birkaç data dictionary viewı vardır. İlki V$ACTIVE_SESSION_HISTORY,
veritabanınızdaki current veya recent sessions hakkında bilgi almak için kullanılabilir. İkincisi, DBA_HIST_ACTIVE_SESS_HISTORY, eski ASH bilgilerini depolamak için kullanılır.
Veritabanınızdaki son 15 dakika içinde tüm etkinlikleri ve toplam bekleme süresini(total wait time) görmek isterseniz aşağıdaki sorguyu verebilirsiniz:
SELECT s.event, sum(s.wait_time + s.time_waited) total_wait
FROM v$active_session_history s
WHERE s.sample_time between sysdate-1/24/4 AND sysdate
GROUP BY s.event
ORDER BY 2 desc;
EVENT TOTAL_WAIT
------------------------------------------ -------------
20002600
db file scattered read 15649078
read by other session 9859503
db file sequential read 443298
direct path read temp 156463
direct path write temp 139984
log file parallel write 49469
db file parallel write 21207
log file sync 11793
SGA: allocation forcing component growth 11711
control file parallel write 4421
control file sequential read 2122
SQL*Net more data from client 395
SQL*Net more data to client 66
- Oturuma özgü daha fazla bilgi edinmek isterseniz ve en çok CPU kaynağını son 15 dakika içinde kullanan top 5 oturumu görmek istiyorsanız, aşağıdaki sorguyu verebilirsiniz:
column username format a12
column module format a30
SELECT * FROM
(
SELECT s.username, s.module, s.sid, s.serial#, count(*)
FROM v$active_session_history h, v$session s
WHERE h.session_id = s.sid
AND h.session_serial# = s.serial#
AND session_state= 'ON CPU' AND
sample_time > sysdate - interval '15' minute
GROUP BY s.username, s.module, s.sid, s.serial#
ORDER BY count(*) desc
)
where rownum <= 5;
USERNAME MODULE SID SERIAL# COUNT(*)
---------- ---------------------------- ---------- ---------- ----------
SYS DBMS_SCHEDULER 536 9 43
APPLOAD etl1@app1 (TNS V1-V3) 1074 3588 16
APPLOAD etl1@app1 (TNS V1-V3) 1001 4004 12
APPLOAD etl1@app1 (TNS V1-V3) 968 108 5
DBSNMP emagent@ora1 (TNS V1-V3) 524 3 2
- SESSION_STATE sütununda bir oturumun etkin olup olmadığını veya kaynaklar için bekleyip beklemediğini belirten iki geçerli ON CPU ve WAITING değeri bulunur.
Kaynakları bekleyen oturumları görmek isterseniz, aynı sorguda SESSION_STATE ile sorgulayabiliriz.
Verilen bir örnek dönem için en çok kullanılan veritabanı nesnelerini görmek isterseniz, bu bilgiyi elde etmek için V$ACTIVE_SESSION_HISTORY i DBA_OBJECTS viewına joinleyebiliriz.
Aşağıdaki örnekte, son 15 dakika içinde, en çok kullanımda olana 5 database objesini ve bunlarla ilişkili nesnelerin listisini getirmek için:
SELECT * FROM
(
SELECT o.object_name, o.object_type, s.event,
SUM(s.wait_time + s.time_waited) total_waited
FROM v$active_session_history s, dba_objects o
WHERE s.sample_time between sysdate - 1/24/4 and sysdate
AND s.current_obj# = o.object_id
GROUP BY o.object_name, o.object_type, s.event
ORDER BY 4 desc
) WHERE rownum <= 5;
OBJECT_NAME OBJECT_TYPE EVENT TOTAL_WAITED
----------------------- --------------- ------------------------------ ------------
WRI$_ALERT_OUTSTANDING TABLE Streams AQ: enqueue block ed on low memory 110070196
APP_ETL_IDX1 INDEX read by other session 65248777
APP_SOURCE_INFO TABLE PARTITION db file scattered read 33801035
EMPPART_PK_I INDEX PARTITION read by other session 28077262
APP_ORDSTAT TABLE PARTITION db file scattered read 15569867
Nasıl Çalışır:
- DBA_HIST_ACTIVE_SESS_HISTORY viewı, V$ACTIVE_SESSION_HISTORY viewından çıkmış oturumlarla ilgili geçmiş bilgileri verir.
Diyelim ki, performans konusunda veritabanınızda kötü bir gün geçirdiniz. Örneğin, performans zayıf olduğunda belirli bir günde en fazla kaynağı
tüketen kullanıcıları elde etmek isterseniz aşağıdaki sorguyu yayınlayabilirsiniz:
SELECT * FROM
(
SELECT u.username, h.module, h.session_id sid,
h.session_serial# serial#, count(*)
FROM dba_hist_active_sess_history h, dba_users u
WHERE h.user_id = u.user_id
AND session_state= 'ON CPU'
AND (sample_time between to_date('2011-05-15:00:00:00','yyyy-mm-dd:hh24:mi:ss')
AND to_date('2011-05-15:23:59:59','yyyy-mm-dd:hh24:mi:ss'))
AND u.username != 'SYS'
GROUP BY u.username, h.module, h.session_id, h.session_serial#
ORDER BY count(*) desc
)
where rownum <= 5;
USERNAME MODULE SID SERIAL# COUNT(*)
------------ ------------------------------ ---------- ---------- ----------
APPLOAD1 etl1@app1 (TNS V1-V3) 1047 317 1105
APPLOAD1 etl1@app1 (TNS V1-V3) 1054 468 659
APPLOAD1 etl1@app1 (TNS V1-V3) 1000 909 387
STG oracle@ora1 (TNS V1-V3) 962 1707 353
APPLOAD1 etl1@app1 (TNS V1-V3) 837 64412 328
- Veritabanı nesnelerini sıfırlamak için, aynı zaman çerçevesi için aşağıdaki sorguyu verebilirsiniz:
SELECT * FROM
(
SELECT o.object_name, o.object_type, s.event,
SUM(s.wait_time + s.time_waited) total_waited
FROM dba_hist_active_sess_history s, dba_objects o
WHERE s.sample_time
between to_date('2011-05-15:00:00:00','yyyy-mm-dd:hh24:mi:ss')
AND to_date('2011-05-15:23:59:59','yyyy-mm-dd:hh24:mi:ss')
AND s.current_obj# = o.object_id
GROUP BY o.object_name, o.object_type, s.event
ORDER BY 4 desc
)
WHERE rownum <= 5;
OBJECT_NAME OBJECT_TYPE EVENT TOTAL_WAITED
---------------------------- --------------- ------------------------- ------------
EMPPART TABLE PARTITION PX Deq Credit: send blkd 8196703427
APPLOAD_PROCESS_STATUS TABLE db file scattered read 628675085
APPLOAD_PROCESS_STATUS TABLE read by other session 408577335
APP_SOURCE_INFO TABLE PARTITION db file scattered read 288479849
APP_QUALITY_INFO TABLE PARTITION Datapump dump file I/O 192290534