基础知识补漏-数据字典

来源:互联网 发布:mac的数据库软件 编辑:程序博客网 时间:2024/05/07 09:18
数据字典


数据字典表(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';





















0 0
原创粉丝点击