动态性能视图
oracle内存在运行中时刻都在变化,这些变化的数据寄存于动态性能表(内存表,固定表)中,随着数据库启动而建立,随数据库运行而增加内容,动态性能表也过于复杂,oracle在此基础之上又建立了视图和同义词,用于DBA判断系统的性能状态信息
这类视图和同义词我们称之为动态性能视图,它存储的是时刻改变的数据
select * from v$FIXED_TABLE
在oracle数据库中还维护与数据实例的操作和性能相关的动态数据集。这些动态性能视图建立在通过数据库服务器内的内存结构构建的虚拟表基础上。也就是说,它们不是驻留在数据库中的常规表。因此,其中的某些视图可以在装载或打开数据库之前显示数据。
动态性能视图包括关于以下内容的信息:
· 会话 · 文件状态 · 作业和任务的进度 · 锁 · 备份状态 ·内存使用和分配 ·系统和会话参数 ·SQL 执行 ·统计信息和度量
注:DICT 和 DICT_COLUMNS 视图也包含这些动态性能视图的名称。
某些动态视图包含的数据不一定适用于实例或数据库的所有状态。例如,如果刚刚启动一个实例,但未装载数据库,则可以通过查询v$BGPROCESS 查看正在运行的后台进程的列表。但不能通过查询v$DATAFILE查看数据库数据文件的状态,因为要由进行装载的数据库读取控制文件后才能找出数据库关联的数据文件。
· 这些视图由SYS用户拥有。
· 不同时间可以使用不同视图:
---- 实例已启动
---- 数据库已装载
---- 数据库已打开
· 通过查询V$FIXED_TABLE 可查看所有视图名称
· 这些视图通常又称为“v$视图”
· 由于数据是动态的,因此这些视图不保证读取一致性
v$开头的就一定是视图吗?
① 以V$PARAMETER 为例,查看一下这个视图的基表是什么,我们利用dbms_metadata.get_ddl(),用它获取V$PARAMETER 的定义,那么需要知道V$PARAMETER 的类型及 owner ,我们用如下命令查询得到类型及owner。
SYS@ORCL>COL OBJECT_NAME FOR A20
SYS@ORCL>COL OBJECT_TYPE FOR A20
SYS@ORCL>COL OWNER FOR A20
SYS@ORCL>select object_name,object_type,owner from all_objects where object_name=upper('v$parameter');
OBJECT_NAME OBJECT_TYPE OWNER
-------------------- -------------------- --------------------
V$PARAMETER SYNONYM PUBLIC
SYS@ORCL>select dbms_metadata.get_ddl(upper('SYNONYM'),upper('V$PARAMETER'),upper('PUBLIC')) from dual;
DBMS_METADATA.GET_DDL(UPPER('S
--------------------------------------------------------------------------------
CREATE OR REPLACE PUBLIC SYNONYM "V$PARAMETER" FOR "SYS"."V_$PARAMETER"
② 通过这一步我们会发现 V$PARAMETER 其实是V_$PARAMETER 的同义词,
SYS@ORCL>select object_name,object_type,owner from all_objects where object_name=upper('v_$parameter');
OBJECT_NAME OBJECT_TYPE OWNER
-------------------- -------------------- --------------------
V_$PARAMETER VIEW SYS
SYS@ORCL>select dbms_metadata.get_ddl (upper('VIEW'),upper('V_$PARAMETER'),upper('SYS')) from dual;
DBMS_METADATA.GET_DDL(UPPER('V
--------------------------------------------------------------------------------
CREATE OR REPLACE FORCE VIEW "SYS"."V_$PARAMETER" ("NUM", "NAME", "TYPE", "VA
......
......from v$parameter
③ 此时就懵了,怎么又回到了 v$parameter 了,如果我们再次get_ddl ,那么就又回到了第一步了,那一定是不对的。我们看一下v_$parameter 是一个视图,那么v$parameter 也有可能是一个固定视图,我们在固定视图定义视图中查询一下。
SYS@ORCL>select view_definition from v$fixed_view_definition where view_name=upper('v$parameter');
VIEW_DEFINITION
--------------------------------------------------------------------------------
select NUM , NAME , TYPE , VALUE , DISPLAY_VALUE, ISDEFAULT , ISSES_MODIFIABLE
, ISSYS_MODIFIABLE , ISINSTANCE_MODIFIABLE, ISMODIFIED , ISADJUSTED , ISDEPRECAT
ED, DESCRIPTION, UPDATE_COMMENT, HASH from GV$PARAMETER where inst_id = USERENV
('Instance')
④ 果然是固定视图,这个固定视图也是根据固定视图所定义的,我们再次查看 GV$parameter 这个固定视图。
SYS@ORCL>select view_definition from v$fixed_view_definition where view_name=upper('gv$parameter');
VIEW_DEFINITION
--------------------------------------------------------------------------------
select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl, ksppstdvl, ksppstdf, decode
(bitand(ksppiflg/256,1),1,'TRUE','FALSE'), decode(bitand(ksppiflg/65536,3),1,'I
MMEDIATE',2,'DEFERRED', 3,'IMMEDIATE','FALSE'),
decode(bitand(ksppiflg,4),4,'FALSE', decod
e(bitand(ksppiflg/65536,3), 0, 'FALSE', 'TRUE')), decode(bitand(ksppstvf,7),
1,'MODIFIED',4,'SYSTEM_MOD','FALSE'), decode(bitand(ksppstvf,2),2,'TRUE','FALSE
'), decode(bitand(ksppilrmflg/64, 1), 1, 'TRUE', 'FALSE'), ksppdesc, ksppstcmn
t, ksppihash from x$ksppi x, x$ksppcv y where (x.indx = y.indx) and ((translat
e(ksppinm,'_','#') not like '##%') and ((translate(ksppinm,'_','#') not like
'#%') or (ksppstdf = 'FALSE') or (bitand(ksppstvf,5) > 0)))
SYS@ORCL>
⑤ 看到 GV$PARAMETER 的基表,终于知道动态性能视图的来龙去脉了。
总结:
-- 在非sys 用户下查看的动态性能视图均为同义词
-- “动态性能视图” 的出处:
X$开头 oracle 的基表 ----> gv$ 开头的 固定视图 -----> v$ 开头的固定视图 ----> v_$ 开头的视图 -----> v$开头的同义词