在Oracle数据库系统中,表是数据库的基本对象,数据库中所有数据都是以表的形式存在的。
http://cuug.com.cn/html/activityinfor_283_283_1054.html?wnlt
环境——Oracle 11g
一.表的类型
Oracle数据库系统中常用的表包括:堆组织表、索引组织表、聚簇表(索引、散列、有序散列)、嵌套表、临时表、外部表、分区表、对象表等。
1.堆组织表
在Oracle系统中,普通的标准数据库表就是堆组织表,其中的数据以堆的方式管理。
堆的含义:以随机方式存储数据的一组空间。
对于堆组织表而言,当进行数据写入时,数据库会使用段中第一个足够的自由空间。
当进行数据删除时,系统允许以后的插入和更新操作重用这部分空间。
2.索引组织表
索引组织表(index organized table,ITO)是按照索引结构存储数据库的表,这样可以提高查询性能。
与堆组织表的随意性不同,索引组织表要求数据行本身具有某种物理顺序,数据只能根据主键有序地存储。这样在索引组织表中执行查询操作时,
使用主键列将会得到较好的读取性能。
3.聚簇表
聚簇,是指一个或多个表组成的组,这些表物理地存储在相同的数据块上,有相同聚簇键值的所有行会相邻地物理存储。
利用聚簇表可以实现将多个表相关的数据存储在一个数据块中,还可以实现把相同聚簇键值的所有数据预先存储起来,如果多个表经常
做链接操作,采用聚簇表可以大大提高检索性能。
oracle 11g提供三种聚簇表:
a.索引聚簇表(Index Cluster Table):基于B-Tree索引聚簇键而创建的聚簇表。聚簇键指向一个oracle块,而不是一行数据。
b.散列聚簇表(Hash Cluster Table):使用散列函数代替B-Tree索引的聚簇键索引,表中的数据就是索引。
在散列聚簇表中,首先通过内部函数或自定义函数进行散列计算,然后将计算得到的码值用于定位表中的数据行。
如果经常使用有相同的包含相等条件的查询子句访问表时,使用散列聚簇很合适。
c.有序散列聚簇表(Sorted Hash Cluster Table):这种散列聚簇表是Oracle 10g增加的,它不仅有散列聚簇的性质,还结合了IOT的一些性质。
如果需要按照某个键获取数据,但是要求这些数据按另外一个列排序,这种情况下适合用有序散列聚簇表。通过使用有序散列聚簇表,
oracle可以不用排序而查询到数据,因为其中的数据时按照键的有序物理存储的。
4.嵌套表
嵌套表是表中之表,是Oracle对象关系扩展的一部分,他们是系统生成和维护的父/子关系中的子表。
嵌套表和子表的区别:子表是独立的表,而嵌套表则不是。一个嵌套表是某些行的集合,它在父表中表示为其中一列。对父表中的每一条记录
嵌套表可以包含多个行。
嵌套表的优点是能够对他们进行索引和不需要连接,缺点是,尽管有级联删除形式(主行删除时将删除所有从属行),但是引用完整性约束是不可能的。
5.临时表
临时表中存储的是事务处理期间或会话期间的临时数据,当事务处理完毕或会话结束,临时表中的数据就被删除。临时表一旦创建就可以在需要
时使用,并且只有向表中插入数据时系统才从当前用户的临时表空间为它分配存储区段。
临时表包括:会话级临时表和事务级临时表。
会话级临时表在会话没有断开之前,其中的数据不会自动删除,会话结束后被系统自动删除。
事务级临时表在事务提交时会被系统自动删除。
6.外部表
这是从Oracle 9i开始增加的表类型,外部表中的数据并不存储在数据库本身中,而是放在数据库之外的文件系统中。
利用外部表可以查询数据库之外的一个文件,可以向数据库加载数据以及写在数据。在Oracle 10g中对外部表做了进一步的改进,引入了
卸载功能,这样可以在不使用数据库链接的情况下,为数据库之间移动数据提供了一种简单的方法。
7.分区表
分区就是将一个非常大的表分成若干个独立的较小的组成部分进行存储和管理。对表进行分区后,表中的记录将根据分区条件分散存储
到不同的分区中,用户可以对整个表进行操作,也可以针对特定的分区进行操作。一般表大小超过2GB时,应该使用分区表;此外,如果表中
包含历史数据,则新的数据被增加到新的分区中。
8.对象表
对象表是基于对象类型创建的表,而不是作为列的集合。对象表中的每一行都是一个对象;每一个对象都有一个标示符(Object Identifier OID)
来唯一标识。在对象表之间没有主外键关联的概念,为了体现这层关系,Oracle使用REF对象来实现。使用对象表可以简化对象的使用,此外对象表
是使用对象类型作为模板来创建表的一种便捷方式,它可以确保多个表具有相同的结构。
二.表的特性
表的特性将决定怎样创建表、怎样在磁盘上存储表,以及当表生成和可以使用之后,应用中最终执行的方式。
(1)TABLESPACE子句
默认情况下,用户创建的表位于用户或数据库默认表空间(USER表空间)上。单用户可以在创建表时,指定代建表的表空间。
(2)STORAGE子句
STORAGE子句多数是在创建表空间时,用来设置表空间的存储属性的。默认情况下,创建在该表空间的数据库对象,都会继承表空间的存储属性。
用户可以在创建表的时候使用STORAGE子句来另外设置表的存储属性。
例:create table t_name(...)STORAGE (INITIAL 200K NEXT 200K PCTINCREASE 20 MAXEXTENTS 15);
INITIAL: 指出为对象分配的第一个区的大小
NEXT: 指出为对象分配的下一个区的大小
PCTINCREASE: 在本地管理表空间内,Oracle数据库在创建段时使用该参数的值确定初始段大小,而后续分配的空间将忽略该参数的值。
在字典管理表空间内,该参数的值指出第三个及其后续区比前一个区增长的百分比。
MINEXTENTS: 在本地管理表空间内,它与前面3个参数一起决定初始段(Segment)的大小。
在字典管理表空间内,其值指出对象创建时分配的区总数。
MAXEXTENTS: 该参数只用于字典管理表空间,它指出Oracle可分配给对象的总区(Extent)数。
(3)LOGGING和NOTLOGGING
使用LOGGING和NOTLOGGING子句指定表是否是日志记录表。
LOGGING子句,系统会记录数据库中所有数据库改变,一旦发生故障,可以从重做日志中获取这些改变,防止数据丢失,提高数据库的可靠性。
NOTLOGGING子句,则不会记录该表上的某些操作日志,这样就只产生很少的日志。注意,并不是说使用NOTLOGGING子句,在表上的操作就全部
不产生重做日志。
一般NOTLOGGING子句只对一下操作起作用:create table as select;
SQL*loader直接路径加载;
直接路径插入;
(4)CACHE和NOCACHE
CACHE子句用来设置对表进行全表搜索时,将数据库读入缓冲区,并且放置到最近最常使用的一端。
NOCACHE子句则表示读入缓冲区的数据库被放置到最近最少使用列表的最近最少使用的一端。
默认情况下创建的表都是NOCACHE。对于频繁进行全表搜索的表,可以设置为CACHE。
三.创建表的基本语法
create table [schema.]table_name
(
column_name datatye [default expr] [constraint_name] constraint_def --列1
,column_name datatye [default expr] [constraint_name] constraint_def --列2
...
,column_name datatye [default expr] [constraint_name] constraint_def --列n
)
[PCTFREE n]
[PCTUSED n]
[INITRANS]
[STORAGE storage]
[TABLESPACE table_space]
[as sub_querry]
;
备注:
PCTFREE 用于的空间百分比(0~99),0表示插入式完全填满数据块,缺省为10;
PCTUSED 为表的每个数据库保留的可用空间的最小百分比(1~99),缺省为40;
PCTFREE和PCTUSED的组合决定了将插入的数据是否放入一个新的数据块中。
INITRANS 指出在分配给数据库对象的每个数据块内分配的最初并发事务项数,其取值为1~255,默认为1;