认识动态视图

平常我们查的V$动态视图实际上是指向V_$视图的同义词,
例如,v$lockv_$lock视图的同义词,v_$lock则是由fixed view-v$lock构成的view,而v$lock最终是由多个x$fixed table组成。

你可以参考如下SQL语句:

select * from dba_synonyms t where t.synonym_name='V$LOCK';

select * from dba_views t where t.view_name='V_$LOCK';

select * from v$fixed_table t where t.name='V$LOCK';

可以查看v$fixed_view_definition动态视图查看此fixed view是如何定义

select * from  v$fixed_view_definition t where t.VIEW_NAME='V$LOCK';

如果你想要在v$lock基础上构建新的视图,则需要将v_$lock授权给此用户。

下面来简单介绍一下Oracle的数据字典:

首先,Oracle的字典表和视图基本上可以分为三个层次。

1.1 X$

    这一部分表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建。
    这部分表对数据库来说至关重要,所以Oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。
    如果显示授权你会收到如下错误:

SQL> grant select on x$ksppi to eygle;

grant select on x$ksppi to eygle

*

ERROR at line 1:

ORA-02030: can only select from fixed tables/views

1.2 GV$V$视图

Oracle8开始,GV$视图开始被引入,其含义为Global V$.
    除了一些特例以外,每个V$视图都有一个对应的GV$视图存在.
    GV$视图的产生是为了满足OPS环境的需要,OPS环境中,查询GV$视图返回所有实例信息,而每个V$视图基于GV$视图,增加了INST_ID列判断后建立,只包含当前连接实例信息。
    注意,每个V$视图都包含类似语句:
    where inst_id = USERENV(Instance)
    用于限制返回当前实例信息。
    我们从GV$FIXED_TABLEV$FIXED_TABLE开始

SQL> select view_definition from v_$fixed_view_definition
        
 where view_name=’V$FIXED_TABLE’;

VIEW_DEFINITION

----------------------------------------------------------

select NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE

where inst_id = USERENV(’Instance’)

这里我们看到V$FIXED_TABLE基于GV$FIXED_TABLE创建。

SQL> select view_definition from v_$fixed_view_definition

  where view_name=’GV$FIXED_TABLE’;

VIEW_DEFINITION

-----------------------------------------------------------

select inst_id,kqftanam, kqftaobj, ’TABLE’, indx from x$kqfta

union all

select inst_id,kqfvinam, kqfviobj, ’VIEW’, 65537 from x$kqfvi

union all

select inst_id,kqfdtnam, kqfdtobj, ’TABLE’, 65537 from x$kqfdt

这样我们找到了GV$FIXED_TABLE视图的创建语句,该视图基于X$表创建。

1.3 GV_$,V_$视图和V$,GV$同义词
   这些视图是通过catalog.ql创建。
    catalog.sql运行时:

create or replace view v_$fixed_table as select * from v$fixed_table;

create or replace public synonym v$fixed_table for v_$fixed_table;

create or replace view gv_$fixed_table as select * from gv$fixed_table;

create or replace public synonym gv$fixed_table for gv_$fixed_table;

我们注意到,第一个视图V_$GV_$首先被创建,v_$gv_$两个视图。

然后基于V_$视图的同义词被创建。

所以,实际上通常我们访问的V$视图,其实是指向V_$视图的同义词。

V_$视图是基于真正的V$视图(这个视图是基于X$表建立的)

v$fixed_view_definition视图是我们研究Oracle对象关系的一个入口,仔细理解Oracle的数据字典机制,有助于深入了解和学习Oracle数据库知识。
 

1.4 再进一步

1.4.1 X$

关于X$表,其创建信息我们也可以从数据字典中一窥究竟。

首先我们考察bootstrap$表,该表中记录了数据库启动的基本及驱动信息。

SQL> select * from bootstrap$;

LINE# OBJ# SQL_TEXT

------------------------------------------------------------------

-1 -1 8.0.0.0.0

0 0 CREATE ROLLBACK SEGMENT SYSTEM STORAGE ( INITIAL 112K NEXT 1024K

MINEXTENTS 1 M

8 8 CREATE CLUSTER C_FILE#_BLOCK#("TS#" NUMBER,"SEGFILE#" NUMBER,

"SEGBLOCK#" NUMBER)

9 9 CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE 10

INITRANS 2 MAXT

14 14 CREATE TABLE SEG$("FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT

NULL,"TYPE#" NUMBE

5 5 CREATE TABLE CLU$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"TS#"

NUMBER NOT NULL

6 6 CREATE CLUSTER C_TS#("TS#" NUMBER) PCTFREE 10 PCTUSED 40 INITRANS

2 MAXTRANS 255

7 7 CREATE INDEX I_TS# ON CLUSTER C_TS# PCTFREE 10 INITRANS 2 MAXTRANS

255 STORAGE (

....

这部分信息,在数据库启动时最先被加载,跟踪数据库的启动过程,我们发现数据库启动的第一个动作就是:

create table bootstrap$ ( line# number not null, obj# number not null,

sql_text varchar2(4000) not null) storage (initial 50K objno 56 extents

(file 1 block 377))

     这部分代码是写在Oracle应用程序中的,在内存中创建了bootstrap$以后,Oracle就可以从file 1,block 377上读取其他信息,创建重要的数据库对象。从而根据这一部分信息启动数据库,这就实现了数据库的引导,类似于操作系统的初始化。 这部分你可以参考biti_rainy的文章。

X$表由此建立。这一部分表可以从v$fixed_table中查到:

SQL> select count(*) from v$fixed_table where name like ’X$%’;

COUNT(*)

----------

394

共有394X$对象被记录。 

1.4.2 GV$V$视图

X$表建立以后,基于X$表的GV$V$视图得以创建。

这部分视图我们也可以通过查询V$FIXED_TABLE得到。

SQL> select count(*) from v$fixed_table where name like ’GV$%’;

COUNT(*)

----------

259

     这一部分共259个对象。

SQL> select count(*) from v$fixed_table where name like ’V$%’;

COUNT(*)

----------

259

同样是259个对象。

v$fixed_table共记录了394 + 259 + 259 912 个对象。

我们通过V$PARAMETER视图来追踪一下数据库的架构:

SQL> select view_definition from v$fixed_view_definition a where

a.VIEW_NAME=’V$PARAMETER’;

VIEW_DEFINITION

-------------------------------------------------------------------

select NUM , NAME , TYPE , VALUE , ISDEFAULT , ISSES_MODIFIABLE ,

ISSYS_MODIFIA

BLE , ISMODIFIED , ISADJUSTED , DESCRIPTION, UPDATE_COMMENT from

GV$PARAMETER wh

ere inst_id = USERENV(’Instance’)

我们看到V$PARAMETER是由GV$PARAMETER创建的。

SQL> select view_definition from v$fixed_view_definition a where

a.VIEW_NAME=’GV$PARAMETER’;

VIEW_DEFINITION

-------------------------------------------------------------------

select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl,ksppstdf, decode

(bitand(kspp

iflg/256,1),1,’TRUE’,’FALSE’), decode(bitand(ksppiflg/65536,3),1,

’IMMEDIATE’,2,

’DEFERRED’, 3,’IMMEDIATE’,’FALSE’), decode(bit and(ksppstvf,7),

1,’MODIFIED’,4,’SYSTEM_MOD’,’FALSE’), decode(bitand(ksppstvf,2

,2,’TRUE’,’FALSE’), ksppdesc, ksppstcmnt from x$ksppi x, x$ksppcv

y where (x.indx = y.indx) and ((translate(ksppinm,’_’,’#’) not

like ’#%’) or (ksppstdf = ’FALSE’))

在这里我们看到GV$PARAMETER来源于x$ksppi,x$ksppcv两个X$表。 x$ksppi,x$ksppcv 基本上包含所有数据库可调整参数,v$parameter展现的是不包含"_"开头的参数。以"_"开头的参数我们通常称为隐含参数,一般不建议修改,但很多因为功能强大经常使用而广为人知。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13129975/viewspace-625231/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13129975/viewspace-625231/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值