不管是 EM 也好,或是前面演示中使用的 awr*.sql 脚本也好,实质都是访问 ORACLE 中的部分相关视图来生成统计数据,因此如果 DBA 对自己的理解能力有足够的自信,也可 以直接查询动态性能视图(或相关数据字典)的方式来获取自己想要的那部分性能数据。 ORACLE 将这部分性能统计数据保存在 DBA_HIST 开头的数据字典中,要查询当前实例所
有能够访问的 DBA_HIST 字典,可以通过下列语句:
SQL> select * from dict where table_name like 'DBA_HIST%';
|
TABLE_NAME |
COMMENTS |
|
------------------------------ -------------------------------------------------------------------------------- |
|
|
DBA_HIST_DATABASE_INSTANCE |
Database Instance Information |
|
DBA_HIST_SNAPSHOT |
Snapshot Information |
|
DBA_HIST_SNAP_ERROR |
Snapshot Error Information |
|
DBA_HIST_BASELINE |
Baseline Metadata Information |
|
DBA_HIST_WR_CONTROL |
Workload Repository Control Information |
|
DBA_HIST_DATAFILE |
Names of Datafiles |
|
DBA_HIST_FILESTATXS |
Datafile Historical Statistics Information |
|
DBA_HIST_TEMPFILE |
Names of Temporary Datafiles |
|
DBA_HIST_TEMPSTATXS |
Temporary Datafile Historical Statistics |
|
Information |
|
|
DBA_HIST_COMP_IOSTAT |
I/O stats aggregated on component level |
|
DBA_HIST_SQLSTAT |
SQL Historical Statistics Information |
|
DBA_HIST_SQLTEXT |
SQL Text |
|
...................... |
|
|
........................ |
|
ORACLE 数据库中以 DBA_HIST 命名的视图非常多,下面简单介绍几个,比如说:
? V$ACTIVE_SESSION_HISTORY
该视图由 ASH 自动维护,以每秒一次的频率收集当前系统中活动 session 的信息。 虽然说是记录 SESSION 的历史记录,不过该视图与 V$SESSION 还是有差异的。
|
SQL> desc v$active_session_history; |
|
|
|
|
Name |
Type |
Nullable Default Comments |
|
|
------------------------- ------------ -------- ------- -------- |
|
||
|
SAMPLE_ID |
NUMBER |
|
Y |
|
SAMPLE_TIME |
TIMESTAMP(3) Y |
||
|
SESSION_ID |
NUMBER |
|
Y |
|
SESSION_SERIAL# |
NUMBER |
|
Y |
|
USER_ID |
NUMBER |
|
Y |
|
SQL_ID |
VARCHAR2(13) Y |
|
|
|
SQL_CHILD_NUMBER |
NUMBER |
|
Y |
|
SQL_PLAN_HASH_VALUE |
NUMBER |
|
Y |
|
FORCE_MATCHING_SIGNATURE NUMBER |
Y |
||
|
SQL_OPCODE |
NUMBER |
|
Y |
|
PLSQL_ENTRY_OBJECT_ID |
NUMBER |
|
Y |
|
PLSQL_ENTRY_SUBPROGRAM_ID NUMBER |
Y |
||
|
PLSQL_OBJECT_ID |
NUMBER |
|
Y |
|
PLSQL_SUBPROGRAM_ID |
NUMBER |
|
Y |
|
SERVICE_HASH |
NUMBER |
|
Y |
|
SESSION_TYPE |
VARCHAR2(10) Y |
||
|
SESSION_STATE |
VARCHAR2(7) Y |
|
|
QC_SESSION_ID |
NUMBER |
Y |
|
QC_INSTANCE_ID |
NUMBER |
Y |
|
BLOCKING_SESSION |
NUMBER |
Y |
|
BLOCKING_SESSION_STATUS VARCHAR2(11) Y |
||
|
BLOCKING_SESSION_SERIAL# NUMBER |
Y |
|
|
EVENT |
VARCHAR2(64) Y |
|
|
EVENT_ID |
NUMBER |
Y |
|
EVENT# |
NUMBER |
Y |
|
SEQ# |
NUMBER |
Y |
|
P1TEXT |
VARCHAR2(64) Y |
|
|
P1 |
NUMBER |
Y |
|
P2TEXT |
VARCHAR2(64) Y |
|
|
P2 |
NUMBER |
Y |
|
P3TEXT |
VARCHAR2(64) Y |
|
|
P3 |
NUMBER |
Y |
|
WAIT_CLASS |
VARCHAR2(64) Y |
|
|
WAIT_CLASS_ID |
NUMBER |
Y |
|
WAIT_TIME |
NUMBER |
Y |
|
TIME_WAITED |
NUMBER |
Y |
|
XID |
RAW(8) |
Y |
|
CURRENT_OBJ# |
NUMBER |
Y |
|
CURRENT_FILE# |
NUMBER |
Y |
|
CURRENT_BLOCK# |
NUMBER |
Y |
|
PROGRAM |
VARCHAR2(48) Y |
|
|
MODULE |
VARCHAR2(48) Y |
|
|
ACTION |
VARCHAR2(32) Y |
|
|
CLIENT_ID |
VARCHAR2(64) Y |
|
v$session 中与操作相关的列均被收集,除此之外还冗余了部分列,这是为了方便
DBA 查询 V$ACTIVE_SESSION_HISTORY 时能够快速获取到自己需要的数据。
? DBA_HIST_ACTIVE_SESS_HISTORY
该视图与 V$ACTIVE_SESSION_HISTORY 的结构灰常灰常灰常的想像,功能也灰 常灰常灰常的类似, 都是记录活动 session 的操作记录, 所不同点在于,
V$ACTIVE_SESSION_HISTORY 是 ORACLE 自动在内存中维护的,受制于其可用内存 区限制,并非所有记录都能保存,而 DBA_HIST_ACTIVE_SESS_HISTORY 视图则是 维 护 到 磁 盘 中 的 。 简 单 理 解 的 话 , 就 是 说 通 常 情 况 下 ,
DBA_HIST_ACTIVE_SESS_HISTORY 视 图 的 数 据 量 要 比
V$ACTIVE_SESSION_HISTORY 的多。
提示:上述结构并不绝对,因为默认情况下 DBA_HIST_ACTIVE_SESS_HISTORY
字典的数据每 10 秒收集一次,而 V$ACTIVE_SESSION_HISTORY 中则是每秒一次, 因此也有可能 V$ACTIVE_SESSION_HISTORY 中记录量更大。不过相对来说,
DBA_HIST 字典中保存的数据更长久。
? DBA_HIST_DATABASE_INSTANCE
该视图用来显示数据库和实例的信息,比如 DBID,实例名,数据库版本等等信息,
生成报表中第一行表格,就是由该视图生成的。如图:
如果你去分析 awrrpt.sql 脚本的话,会发现其中有如下脚本,上述表格中显示的内 容信息,正是来自于下列脚本:
select distinct
(case when cd.dbid = wr.dbid and
cd.name = wr.db_name and ci.instance_number = wr.instance_number and ci.instance_name = wr.instance_name
|
then '* ' |
|
|
else ' ' |
|
|
end) || wr.dbid |
dbbid |
|
, wr.instance_number instt_num |
|
|
, wr.db_name |
dbb_name |
|
, wr.instance_name |
instt_name |
|
, wr.host_name |
host |
from dba_hist_database_instance wr, v$database cd, v$instance ci;
? DBA_HIST_SNAPSHOT
该视图用来记录当前数据库收集到的快照信息。相信朋友应该还记得之前使用脚本
生成报表时,输入完快照区间后显示的一堆列表,没错,那正是 DBA_HIST_SNAPSHOT 记录的内容,该段功能对应的代码如下:
select to_char(s.startup_time,'dd Mon "at" HH24:mi:ss') instart_fmt
|
, di.instance_name |
|
inst_name |
|
, di.db_name |
|
db_name |
|
, s.snap_id |
|
snap_id |
|
, to_char(s.end_interval_time,'dd Mon YYYY HH24:mi') snapdat |
||
|
, s.snap_level |
|
lvl |
|
from dba_hist_snapshot s |
|
|
|
, dba_hist_database_instance di |
|
|
|
where s.dbid |
= :dbid |
|
|
and di.dbid |
= :dbid |
|
|
and s.instance_number |
= :inst_num |
|
|
and di.instance_number |
= :inst_num |
|
|
and di.dbid |
= s.dbid |
|
|
and di.instance_number |
= s.instance_number |
|
|
and di.startup_time |
= s.startup_time |
|
|
and s.end_interval_time >= decode( &num_days |
||
|
|
, 0 |
, to_date('31-JAN-9999','DD-MON- |
YYYY')
, 3.14, s.end_interval_time
, to_date(:max_snap_time,'dd/mm/yyyy') -
(&num_days-1))
order by db_name, instance_name, snap_id;
更多精彩内容访问http://infocool.net
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1700919/viewspace-2120590/ ,如需转载,请注明出处,否则将追究法律责任。