您的位置:首页 > 其它

基础知识补漏-数据字典

2016-09-08 15:01 267 查看
数据字典

数据字典表(Data dictionary table)用以存储表、索引、约束以及其他数据库结构的信息。 这些对象通常以“$”结尾(例如 TAB$、OBJ$、TS$等),在创建数据库的时候通过运行 sql.bsq 脚本来创建。

DBA_OBJECTS 中有两个字段经常使人误解:OBJECT_ID 和 DATA_OBJECT_ID。这两个字 段分别来自 OBJ$中的 OBJ#和 DATAOBJ#,其中 OBJ#(也即 OBJECT_ID)可以被看作是对 象的逻辑号(类似序列号一样分配),该序号一旦分配之后就不会发生改变;而 DATAOBJ#

(也即 DATA_OBJECT_ID)则是和物理存储关联的编号,通常被认为是对象的物理号,这个 编号会随着对象物理存储结构的改变而发生改变。

不要在 DATAOBJ#上创建索引,因为在空间事务如 TRUNCATE 中, DATAOBJ#会发生改变。

在执行 TRUNCATE 操作时,数据库只是简单的回收空间,将空间标记为可用(并不会去数据块上真正去删除数据), 同时将对象的数据对象重新定位,完成空间回收。那么实际上,虽然 Oracle 并未 供直接的 办法,在原对象存储位置被重新写入数据之前,TRUNCATE 数据仍然是有办法恢复的。

查询当前会话的trace文件(仅11g)

SQL> SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Default Trace File';

Oracle 通过将 DDL 解析为 DML 操作,并且将这些操作记录在数据字典表中。

查询表的ddl语句

set pagesize 99

set long 12000

select dbms_metadata.get_ddl('TABLE','EYGLE') from dual;

静态数据字典视图按照前缀的不同通常被分为三类:

1.USER_ 类视图包含了用户所拥有的相关对象信息,用户可以通过这个视图查询自己拥有的对象信息。

2.ALL_ 类视图包含了用户有权限访问的所有对象的信息。

3.DBA_ 类视图包含了数据库所有相关对象的信息,用户需要 SELECT ANY TABLE 权

限才能访问。

每个用户与方案 (Schema)是对应的,Schema 是用户所拥有的对象的集合。

简要统计不同用户拥 有的表对象数量

select owner,count(*) from dba_tables group by owner order by 2;

创建公共同义词

CREATE PUBLIC SYNONYM sales FOR eygle.sales_data;

除了一些特例以外,每个 V$视图都有一个对应的 GV$视图存在。

v$视图来自gv$视图,gv$视图来自x$表。

V_$视图的权限可以授予其他用户, 而 Oracle 不允许任何对于 V$视图的直接授权。

通常大部分用户访问的 V$对象,并不是视图,而是指向 V_$视图的 同义词;而 V_$视图是基于真正的 V$视图(这个视图是基于 X$表建立的)创建的。

在数据库进行数据访问时,oracle优先访问view,然后是同义词。

动态性能视图是在数据库启动过程中自动创建的,所以在数据库启动的不同阶段,我们能访问的视图也各不相同。

根据object_id查看对象信息

select object_name,object_id,object_type from dba_objects where object_id=841;

oracle对于对象名的解析顺序:

1、oracle首先查看在发出命令的用户模式中是否存在表或视图。

2、如果表或视图不存在,检查私有同义词是否存在。

3、如果私有同义词存在,使用这个同义词所用的对象。

4、如果私有同义词不存在,检查同名的公有同义词是否存在。

5、如果公有同义词存在,将使用这个同义词所引用的对象。

6、如果公有同义词不存在,返回ORA-00942 table or view does not exist

在业务系统的底层,应该尽量避免频繁使用复杂的数据字典视图。

存在long数据类型的表的复制

copy from oti/oti@fwx to oti/oti@fwx create all_tab_columns_temp using select * from all_tab_columns t where t.owner = 'OTI';
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: