最近在温习书本的时候,看到了相关的章节,就当做笔记记录总结下。
oracle提供了以下几种类型的表给我们使用,每个类型都有不同的应用场景。
<!--more-->表类型
1、堆表 heap organized table
默认情况下使用create table语句将创建一个堆表,标准的数据表,无序地存储行。
2、聚簇表 clustered table (索引聚簇表 index clustered table 散列聚簇表 hash clustered table 有序散列聚簇表 sorted hash clustered table )
3、索引组织表 index organized table IOT
4、嵌套表 nested table
5、临时表 temporary table
6、对象表 object table
7、外部表 external table
术语
一个表最多有1000列,列数超过254的,oracle在内部会将这些行存储在单独的列段(row price),并相互指向且需要重组成完整行影像;
一个表空间最多由1022个文件组成(bigfile除外);
一个数据文件最大大小=dbblock size*2^22-1。
段segment
段是占用磁盘存储空间的对象,常见的段如下:
1、聚簇段 cluster
分为B*树聚簇和散列聚簇,能把相关信息物理的聚集在一起。
2、表段 table
最为常见的,通常和索引段结合使用。
3、表分区(table partition)段和子分区段(subpartition)
与表段类型,但是应用于分区。
分区表由一个或者多个表分区段组成;
组合分区表则由一个或者多个子分区段组成。
4、索引段 index
用于保存索引结构。
5、索引分区段 index partition
类似分区段,索引分区段包含索引的一个片,分区索引由一个或者多个索引分区段组成。
6、lob分区(lob partition)段、lob子分区(lob subpartition)段、lob索引(lobindex)段和lob(lobsegment)段
lob索引和lob段保存大对象的结构。
当对包含lob表进行分区的时候,就会出现lob分区段。
lob列将自动生成对应的lob索引段。
7、嵌套表(nested)段
嵌套表使用的段类型。
8、回滚(rollback)段和type2 undo 段
都用于undu数据存储。
rollback是手工创建,后一种的oracle自动创建和管理的。
看个简单的例子:
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system
SQL>
SQL> Create Table segments_before As Select * From Dba_Segments;
Table created
SQL> Create Table table_test (Id Number,photo Clob);
Table created
SQL> create index i_table_test on table_test(id);
Index created
SQL> select owner,segment_name,segment_type from Dba_Segments minus select owner,segment_name,segment_type from segments_before;
OWNER SEGMENT_NAME SEGMENT_TYPE
------------------------------ -------------------------------------------------------------------------------- ------------------
SYSTEM I_TABLE_TEST INDEX
SYSTEM SEGMENTS_BEFORE TABLE
SYSTEM SYS_IL0000055658C00002$$ LOBINDEX
SYSTEM SYS_LOB0000055658C00002$$ LOBSEGMENT
SYSTEM TABLE_TEST TABLE
表TABLE_TEST包含了4个段,一个table、一个index、一个lobsegment和一个lobindex段。每个lob列都会创建2个段:lobsegment用于存储lob实际数据,一个用来组织和访问lob对象的lobindex。
段的管理segment
手工管理manual segment space mangement和自动管理auto segmnet space mangement(ASSM)
高水印high-water mark,HWM
随着数据的插入和更新,HWM将会逐渐提高,不过HWM下的块并不都是格式化过的,只有在第1次使用该块的时候才进行格式化,并提供安全的读取,对应的这些安全的块在低水印之下,允许安全地、直接的读取,而对低、高水印之间的块需要进行过滤和判断地读取和使用处理。这里所谓安全的数据块,是指对应块是包含有意义的可以被处理的数据。
自由列表freelists
针对手动管理的表空间的对象进行块维护的参数。
一个对象可以有多个自由列表进程,但是每个进程只会使用自己的空闲块,当前进行内无法找寻到更多的自由空间情况下,只会向主进程请求空间,这样就会造成空间的浪费。
自动管理的表空间已经废弃掉了该参数。
pctfree pctused
针对手动管理的表空间的对象进行块维护的参数。
默认值为10%和40%。
这2个参数,在手工管理的表空间对象上,与freelists结合使用,用于维护进出freelists的阀值。对应默认的10%和40%值,其含义为:块上的只有空间大于10%的时候,进入存在于freelists,否则将被踢出队列,之后,当已用空间小于40%的时候,重新进入存在一队列。pctfree太大,将可能造成空间浪费,太小,就可能造成行迁移。
而在assm管理的空间对象上,没有pctused和freelists的说法,只是通过pctfree来控制块是否允许被使用插入。
自动管理的表空间已经废弃掉了该参数pctused。
堆组织表heap organized table
没什么特殊的了,一个简单的例子
create table hot_table (id number);
索引组织表 index organized table,IOT
索引组织表就是存储在索引结构的表。存储在堆中的表是无组织的(也就是说,只要有可用的空间,数据可以放在任何地方),IOT中的数据则按主键存储和排序。数据就是索引,索引就是数据,因此,相对应堆表来说,节省了存储空间,不过维护的复杂程度增加了。
IOT表没有表段,实质上是索引段。
一个简单的例子:
CREATE Table IOT_TABLE
( ID NUMBER,
CONSTRAINT PK_TEST PRIMARY KEY (Id) ) organization Index;
IOT表可以建立索引,等于是二次索引,二次索引的效率低于常规表的索引:一次扫描二次结构,再一次扫描IOT本身。
索引聚簇表 index clustered table
首先创建一个聚簇对象:
create cluster emp_dept_cluster
( deptno number(2) ) size 1024 ;
然后创建聚簇索引:
create index emp_dept_cluster_idx on cluster emp_dept_cluster;
然后在这个聚簇对象上创建聚簇表;
create table dept
( deptno number(2) primary key,
dname varchar2(14),
loc varchar2(13)
) cluster emp_dept_cluster(deptno);
查看系统的聚簇表:
select cluster_name, table_name from DBA_tables where cluster_name is not null order by 1;
注意:聚簇表存在相同的行的rowid
-The End-