Tablespace(表空间):表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都放在指定的表空间中,但主要存放的对象是表,所以称为表空间。
默认的系统表空间:system、sysaux、temp、undo、user
segments(段)
段是表空间的重要组织机构,段是指占用文件空间的统称,或数据对象使用的空间集合;段可以有表段、索引段、回滚段、临时段和高速缓存段。
段的类型:
聚簇 cluster
表 table
表分区 table partition
索引 index
索引分区 index partition
lob分区 lob partition(lob子分区 lobsub partition、lob索引 lob index、lob 段 lob segment)
嵌套表 nested table
回滚段 roll back
Table :
对于一个只有几百条几千条数据,一个学校的学生成绩表,那么一张表就是一个 segments 。
Table partition : 如果一张表非常大,里面存储了几千万条、上亿条记录,那么对这一张表进行操作,效率就非常低了。分区表是将大表的数据分成称为分区的许多小的子集。假如一张表是存放几亿条数据,那么这么多条记录是有规律的,可以基于某一个字段将其分开。那么可以根据某一字段类型分区,每个分区实际上就是一个独立的表,但在逻辑上这些分区又同属于一张表。
如果一张表是普通的表,只占一个 segments;如果一张表是 partition 的表,可能占用多个 segments。
Cluster :
Oracle 中普通的表称为堆表(heap table),堆表中的数据是无序存放的,往往在使用一段时间后,数据就变得非常无序。比如:索引中相同的 key 对应的数据存放在不同的 block 中,这时,如果要通过索引查询某个 key 的数据,就需要访问很多不同的 block,代价非常高。 我们发现很多表与表,他们的数据有相关性,因为我们访问一个表里的数据,往往要访问另一些表里的数据。我们可以把这些数据物理上存储在一块。
Index
索引是与表和聚集相关的一种选择结构,就当于我们一本书的目录,可以快快速的定位某章某节的页数。索引可以建立在一个表的一列或多列上,那就可以大大提高对表的查询。那么一个 index 也可能会占一个多个 segments 。
Index-organized table :
索引组织表(IOT),就是存储在一个索引结果中的表。存储在堆中的表是无组织的(也就是说,只要有可用的空间,数据可放在任何地方)。对你的应用来说,IOT 表和一个“常规”表并无差别。使用堆组织表时,我们必须为表和表主键上的索引分别留出空间。而 IOT 不存在主键的空间开销,因为索引就是数据,数据就是索引。
IOT 带来的好处不仅节约磁盘空间的占用,更重要的是大幅度降低了 I/O,减少了访问缓冲区 缓存(尽管从缓冲区缓存获取数据比硬盘要快得多,但缓冲区缓存并不是免费,而且也绝不是廉价的。每个缓冲区缓存获取都需要缓冲区缓存的多个闩(shuān),而闩是串行化设备,会限制应用的扩展能力)
Index partition
对于 table 有 partition ,那么对一个大的 index 有也 partition 。
分区所引可以分为全局分区索引与本地分区索引,其中本地索引又可以分为本地前缀索引和本地非前缀索引。 本地索引的分区和其对应的表分区数量相等,因此每个表分区都对应着相应的索引分区。使用本 地索引,不需要指定分区范围因为索引对于表而言是本地的,当本地索引创建时,Oracle 会自动 为表中的每个分区创建独立的索引分区。全局索引以整个表的数据为对象建立索引,索引分区中的索引条目既可能是基于相同的键值但是 来自不同的分区,也可能是多个不同键值的组合。全局索引既允许索引分区的键值和表分区键值 相同,也可以不相同。全局索引和表之间没有直接的联系,这一点和本地索引不同。
Undo segment 回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值)。回滚段的头部包含正在使 用的该回滚段事务的信息。一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可 以存放多个事务的回滚信息。
Temporary segment
当 Oracle 处理一个查询时,经常需要为SQL语句的解析与执行的中间结果(intermediate stage) 准备临时空间。Oracle 会自动地分配被称为临时段(temporary segment)的磁盘空间。例如, Oracle 在进行排序操作时就需要使用临时段。当排序操作可以在内存中执行,或 Oracle 设法利用 索引时,就不必创建临时段。
LOB segment
Large object(LOB)大大的对象,我们知道数据库不但可以存数据,有些可以存储视频声音图 片等文件,对于这种类型的文件一个大小几 MB,几十 MB 很正常。当然,有些数据库是不支持 LOB 数据块的,可以在表里存一个指针,来指向某个文件下的视频声音文件。
Nested table
嵌套表,表中表,和 LOB 思想很类似,就是在表里存一个指针,指针指向另外一张表。
段的创建:
在表、索引等创建的过程中(在 11gR2 中,段的创建要等到第一条数据被插入时),事实上即 在创建段,从 user_segment 可以查看已创建的段
SQL> create table test(id number,name varchar2(20));
然后查询
SQL> select segment_name,segment_type,tablespace_name,bytes,blocks,extents from user_segments;
你会发现没有数据,插入一条数据试一下
SQL> insert into test(id,name) values(1,'test');
然后在查询
SQL> select segment_name,segment_type,tablespace_name,bytes,blocks,extents from user_segments;
这个时候,你会查到数据了。
在 11gR2 中,只有插入数据后才会分配段空间,或者在 11g 中只要插入一条数据或者在创建表时指定 segment creation immediate 即可得到相同效果。
而 10g 中,创建表就会分配一个段空间。
SQL> create table test(id number primary key) segment creation immediate;
然后查询段
SQL> select segment_name,segment_type,tablespace_name,bytes,blocks,extents from user_segments;
SQL> create table test3(id number primary key, describe clob, comment blob) segment creation immediate;
然后查询段
SQL> select segment_name,segment_type,tablespace_name,bytes,blocks,extents from user_segments;
由此可见,test1 只创建一个表的段,test2 创建了一个表段以及一个索引段,test3 创建了一个表段、一 个索引段、2 个 lobindex,2 个 lobsegment。
结论:创建一个表时,表的信息及数据可能会分散到多个段之中,每个段保存着一部分信息,而段由区组成,区由 oracle 块组成,oracle 块由操作系统组成。
创建一个新段时,默认由 1 个区、8 个块组成,共计 8K*8 空间,默认情况下 oracle 块大小为 8k.