日期:2014-05-17  浏览次数:22042 次

user_segments和user_tables的区别?
这2张数据字典都能查找到用户创建的表,它两有什么区别?

是user_tables只能查找到当前用户所有的table的信息,而user_segments是查询到当前用户所有的segment信息?

那我创建的临时表为什么在user_tables中能查找到,而在user_segments中找不到呢?

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

segment到底应该怎么理解?老师说一张表就是一个segment,那segment还可以是索引,其他数据库对象等等。

------解决方案--------------------
我认为 一张表是一个segment 但是一个segment不一定只能是一张表
关于临时表在table中有 在segment中没有的问题 要看你的数据库是什么版本
11g中默认 只有插入数据时 才给表分配segment 为了节省资源 新建的空表不分配 当然也可以配置新建时分配
------解决方案--------------------
段(segment)是表空间中主要的组织结构,有很多种段,回滚段,临时段,索引段........
段分为区段,区段分为块,块是oracle中最小的空间分配单位,数据就存储在这里;
一个段中可以存放多个表的数据,比如几十行的小表;
一个表也可能占用多个段,比如数据量大的表,分区表;
------解决方案--------------------
创建Oracle 临时表,可以有两种类型的临时表:

会话级的Oracle临时表

事务级的临时表 。
1) 会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。

即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table ,即数据清空)了。会话级的临时表创建方法:

1.Create Global Temporary Table Table_Name

2.(Col1 Type1,Col2 Type2...) On Commit Preserve Rows ;

举例:

1.create global temporary table Student

2.(Stu_id Number(5),

3.Class_id Number(5),

4.Stu_Name Varchar2(8),

5.Stu_Memo varchar2(200)) on Commit Preserve Rows ;

2) 事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,Oracle临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION 的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:

1.Create Global Temporary Table Table_Name

2.(Col1 Type1,Col2 Type2...) On Commit Delete Rows ;

举例:

1.create global temporary table Classes

2.(Class_id Number(5),

3.Class_Name Varchar2(8),

4.Class_Memo varchar2(200)) on Commit delete Rows ;

3) 两中类型临时表的区别

会话级临时表采用 on commit preserve rows ;而事务级则采用 on commit delete rows ;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit 、 rollback 或者是会话结束,Oracle临时表中的数据都将被截断


------解决方案--------------------
user_tables 是当前用户下的表.
user_segments 是oracle对象存储的体现。
segment的类型很多,比如表、索引、分区表、簇等等。
正常来说,一个segment类型就分配一个对应的segment.
比如create table,同时又建个索引,那么就会存在两个segment.