Oracle10G的ASH实践一

前言: ASH是oracle10G开始推出的一个新特性,  这个特性的推出对于DBA来说是非常有价值的。它以V$Ssssion为基础,每秒采样一次,

         记录活动会话等待的事件。ASH的信息可以通过两种数据字典视图来查看,一部分是V$active_session_history,里面的数据比较新;

         另一部分是dba_hist_active_sess_history,是历史数据。

-----1>从dba_objects查询得到V$ACTIVE_SESSION_HISTORY是一个public的同义词

SQL> select owner,object_name,object_type from dba_objects where object_name='V$ACTIVE_SESSION_HISTORY';
OWNER                          OBJECT_NAME                                                                      OBJECT_TYPE
------------------------------ -------------------------------------------------------------------------------- -------------------
PUBLIC                         V$ACTIVE_SESSION_HISTORY                                                         SYNONYM

----2>到同义词视图里去查看,是从哪里的,找到了V_$ACTIVE_SESSION_HISTORY      

SQL> select * from dba_synonyms where synonym_name='V$ACTIVE_SESSION_HISTORY';
OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME                     DB_LINK
------------------------------ ------------------------------ ------------------------------ ------------------------------ --------------------------------------------------------------------------------
PUBLIC                         V$ACTIVE_SESSION_HISTORY       SYS                            V_$ACTIVE_SESSION_HISTORY

 


-----3>查看V_$ACTIVE_SESSION_HISTORY,是一个视图。

SQL> select owner,object_name,object_type from dba_objects where object_name='V_$ACTIVE_SESSION_HISTORY';
OWNER                          OBJECT_NAME                                                                      OBJECT_TYPE
------------------------------ -------------------------------------------------------------------------------- -------------------
SYS                            V_$ACTIVE_SESSION_HISTORY                                                        VIEW

----4>查看视图代码,发现基表还是v$active_session_history,又回到问题的原点。

SQL> select text from dba_views where view_name='V_$ACTIVE_SESSION_HISTORY';
TEXT
--------------------------------------------------------------------------------
select "SAMPLE_ID","SAMPLE_TIME","SESSION_ID","SESSION_SERIAL#","USER_ID","SQL_ID","SQL_CHILD_NUMBER","SQL_PLAN_HASH_VALUE","FORCE_MATCHING_SIGNATURE","SQL_OPCODE","SERVICE_HASH","SESSION_TYPE","SESSION_STATE","QC_SESSION_ID","QC_INSTANCE_ID","BLOCKING_SESSION","BLOCKING_SESSION_STATUS","BLOCKING_SESSION_SERIAL#","EVENT","EVENT_ID","EVENT#","SEQ#","P1TEXT","P1","P2TEXT","P2","P3TEXT","P3","WAIT_CLASS","WAIT_CLASS_ID","WAIT_TIME","TIME_WAITED","XID","CURRENT_OBJ#","CURRENT_FILE#","CURRENT_BLOCK#","PROGRAM","MODULE","ACTION","CLIENT_ID" from v$active_session_history


----5>突然想到动态性能视图是基于内存的。

        查看V$fixed_view_definition,原来是基于GV$ACTIVE_SESSION_HISTORY。

SQL> select VIEW_DEFINITION from V$fixed_view_definition where view_name='V$ACTIVE_SESSION_HISTORY';
VIEW_DEFINITION
--------------------------------------------------------------------------------
SELECT  sample_id, sample_time, session_id, session_serial#, user_id, sql_id, sql_child_number, sql_plan_hash_value, force_matching_signature, sql_opcode, service_hash, session_type, session_state, qc_session_id, qc_instance_id, blocking_session, blocking_session_status, blocking_session_serial#, event, event_id, event#, seq#, p1text, p1, p2text, p2, p3text, p3, wait_class, wait_class_id, wait_time, time_waited, xid, current_obj#, current_file#, current_block#, program, module, action, client_id FROM  GV$ACTIVE_SESSION_HISTORY WHERE inst_id = USERENV('INSTANCE')

----6>查找发现是GV$ACTIVE_SESSION_HISTORY是一个同义词

SQL> select owner,object_name,object_type from dba_objects where object_name='GV$ACTIVE_SESSION_HISTORY';
OWNER                          OBJECT_NAME                                                                      OBJECT_TYPE
------------------------------ -------------------------------------------------------------------------------- -------------------
PUBLIC                         GV$ACTIVE_SESSION_HISTORY                                                        SYNONYM

----7>查看v$fixed_view_definition,可是字段的最大长度是4000,就认为这个视图的定义超过了4000就看不到完整的内容

SQL> desc v$fixed_view_definition;
Name            Type           Nullable Default Comments 
--------------- -------------- -------- ------- -------- 
VIEW_NAME       VARCHAR2(30)   Y                         
VIEW_DEFINITION VARCHAR2(4000) Y

---8>仍然找不到基表。换个思路,可以试着查找有没有和sql视图类似的情况。

select VIEW_DEFINITION from v$fixed_view_definition where view_name=upper('v$fixed_view_definition');
VIEW_DEFINITION
--------------------------------------------------------------------------------
select  VIEW_NAME , VIEW_DEFINITION from GV$FIXED_VIEW_DEFINITION where inst_id = USERENV('Instance')

---9>找到了定义和基表,查看列定义。

SQL> select VIEW_DEFINITION from v$fixed_view_definition where view_name=upper('gv$fixed_view_definition');
VIEW_DEFINITION
--------------------------------------------------------------------------------
select i.inst_id,kqfvinam,kqftpsel from x$kqfvi i, x$kqfvt t where i.indx = t.indx

--10>从执行计划里可以得到,直接查看gv$active_session_history,终于找到

SQL> explain plan for select * from GV$ACTIVE_SESSION_HISTORY;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2905781256
--------------------------------------------------------------------------------
| Id  | Operation                 | Name                      | Rows  | Bytes |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |                           |   328 |   216K|
|   1 |  VIEW                     | GV$ACTIVE_SESSION_HISTORY |   328 |   216K|
|   2 |   NESTED LOOPS            |                           |   328 |   233K|
|   3 |    FIXED TABLE FULL       | X$KEWASH                  |   100 |  4800 |
|*  4 |    FIXED TABLE FIXED INDEX| X$ASH (ind:1)             |     3 |  2046 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   4 - filter("S"."SAMPLE_ADDR"="A"."SAMPLE_ADDR" AND "S"."SAMPLE_ID"="A"."SAMPL
              "S"."SAMPLE_TIME"="A"."SAMPLE_TIME")
17 rows selected