oracle表

最近在温习书本的时候,看到了相关的章节,就当做笔记记录总结下。

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-

你可能感兴趣的:(oracle)