Oracle数据字典中的GV_$,V_$视图和V$,GV$(Global V$)同义词

来源:互联网 发布:mac系统强制关闭程序 编辑:程序博客网 时间:2024/04/25 08:04

1,GV$视图和V$视图是在数据库创建的过程中建立的,内置于数据库中,Oracle通过v$fixed_view_definition视图为我们展现这些定义。
2,数据字典由4部分组成:neibuRDBMS(X$)表,数据字典表,动态性能(V$)视图和数据字典视图。
3,X$是Oracle核心,用于跟踪内部数据库信息,维持数据库的正常运行,X$表是加密命名的,而且Oracle不做文档说明,是Oracle公司的技术机密,Oracle通过这些X$建立起其他大量的视图,提供用户查询数据库之用。由于X$记录了大量的有用信息,所以也不停地被全球的DBA不懈地探索者,比较我们熟知的有X$BH,X$KSMSP等。
4,X$表是oracle数据库运行的基础,在数据库启动时由Oracle应用程序动态创建,这部分表对数据库来说至关重要,所以Oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。研究X$表的好办法是借用Oracle的AUTOTRACE功能,当查询一些常用视图时可以通过AUTOTRACE功能发现这些VIEW的底层表,但是这个命令只能在sqlplus下使用。
5,关于Autotrace几个常用选项的说明:
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询输出
6,X$KVIT这个X$表记录了和实例相关的一些内部参数设置
select kvittag,kvitval,kvitdsc from x$kvit;
从查询结果可以得知当脏缓冲区阀值达到25%会触发后台进程DBWR执行写动作,No Free Buffer,也就是当进程扫描LRU一定数量的Block之后,如果还找不到足够的Free空间,则触发DBWR执行写出,这个值是40%.
7,每个V$视图都有一个对应的GV$视图存在。GV$视图产生是为了满足OPS 环境的需要。

#解释一下OPS,在Oracle9i之前,RAC的名称是OPS (Oracle parallel Server)。RAC 与 OPS 之间的一个较大区别是,RAC采用了Cache Fusion(高速缓存合并)技术。在 OPS 中,节点间的数据请求需要先将数据写入磁盘,然后发出请求的节点才可以读取该数据。使用Cache fusion时,RAC的各个节点的数据缓冲区通过高速、低延迟的内部网络进行数据块的传输。#

V$视图是基于GV$视图创建的,增加了INST_ID列的WHERE条件限制建立,每个GV$视图都包含类似语句:

where inst_id=USERENV('Instance');
select view_definition from v$fixed_view_definition where view_name='V$FIXED_TABLE';

可以看出V$FIXED_TABLE是基于GV$FIXED_TABLE建立的。
select view_definition from v$fixed_view_definition where view_name='GV$FIXED_TABLE';

可以看出GV$FIXED_TABLE是基于X$表建立的。
8,我们知道,GV$视图和V$视图是在数据库创建过程中建立起来的,内置于数据库中,oracle通过

v$fixed_view_definition视图为我们展现了这些定义。在GV$和V$之后,Oracle建立了GV_$和V_$视图,随后为这些视图建立了公用同义词,这些都是通过catalog.sql脚本实现的。oracle不允许任何对于V$视图的直接授权grant select on v$sga to eygle;会报错。
9,对于内部X$表及V$视图的限制,oracle是通过软件机制来实现的,而非通过数据库权限控制的。我们通常所访问的V$对象,并不是视图,而是指向V_$视图的定义。而V_$视图是基于真正的V$创建的。在进行数据访问时,

Oracle优先访问View,然后是同义词。
10,数据字典表USER_TABLES的创建可以再catalog.sql中看到,where条件中有这样一个限制where o.owner# =

userenv('SCHEMAID')就说明了当前查询只返回当前用户的SCHEMA对象信息。ALL_TABLES视图在where子句中,增加了这样一个条件where o.owner# = u.user# AND and (o.owner# = userenv('SCHEMAID')。这个条件扩展了关于用户有权限访问的对象信息,所以实际上USER_TABLES的结果是ALL_TABLES结果的一个子集。而DBA_TABLES视图的where条件中没有关于Owner的限制,返回了数据库中所有表的信息。
11,Oracle的X$表信息可以从v$fixed_table中查到,而基于X$表建立的GV$和V$视图都可以通过V$FIXED_TABLE来查询。
12,可以通过V$PARAMETER视图来追踪一下数据库的架构
SQL> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='V$PARAMETER';
13,在非SYS用户下查询,访问的是视图还是同义词,毫无疑问是同义词,因为除了SYS用户之外,其他用户不能查询V$视图,也不能被授权给其他用户。
14,Oracle如何通过同义词定位对象,可以通过10046事件来追踪查询,Oracle是根据3个传入参数

owner#=25,name=V$PARAMETER,namespace=1来判断对象类型,参照表,视图优先规则来判断定位的。关于10046事件追踪查询可以参考http://www.eygle.com/case/Use.sql_trace.to.Diagnose.database.htm。

15,SQL语句中Oracle对于对象名的解析顺序如下图:


原创粉丝点击