首页 > Oracle > Oracle 各种类型的数据库表!
2014
06-27

Oracle 各种类型的数据库表!

Long long ago,oracle中只有一种类型的表,也就是堆组织表,是普通的标准数据库表,不过到目前为止,我们所接触的表类型,就比较多了。这篇文章引入oracle的表类型,如需详细了解各种类型的表,可直接点击如下表类型的链接即可,oracle中主要有如下9种表类型:

  1. 堆组织表(heap organized table):普通的标准数据库表,数据已堆的方式管理,默认创建的表就是堆组织表,可能概念比较抽象,比如在insert增加数据时,会使用段中找到的第一个能放下此数据的自由空间,当删除数据后,允许以后的insert和update重用这部分空间,这就好比堆的管理,以一种随机的方式使用。
  2. 索引组织表(index organized table):也称IOT,毫无疑问的是这种表是按照索引的结构存储,因为索引的存储是有序的,所以索引组织表就被强制要求行本身有某种物理顺序。和堆组织表不同的是,在堆中,只要数据放得下,就可以放在任何位置,但索引组织表不同,数据需要根据主键有序的存储。
  3. 索引聚簇表(index clustered table):聚簇指一个或多个表组成的组,表物理的存储在相同的数据库块上,多个表可以物理的存储在一起,可能把多个表的数据存储在同一个块上,另外包含相同聚簇键值(如id=10)的所有数据会物理的存储在一起,这种数据按照聚簇键值聚簇在一起,聚簇键使用B树索引建立。
  4. 散列聚簇表(hash clustered table):类似于聚簇表,但不使用B树索引按聚簇键来定位数据,散列聚簇将键散列到聚簇上,从而找到数据应该在哪个数据库块上。如果需要频繁的通过键的相等性比较来获取数据,散列聚簇表就很适用。
  5. 有序散列聚簇表(sorted hash clustered table):oracle 10G后新增的表类型,既有散列聚簇表的某些特性,也有IOT的某些特性。
  6. 嵌套表(nested table):一眼看去,这个貌似和嵌套循环有点相似,这样就大错特错了,嵌套表和嵌套循环没有一点关系,嵌套表是oracle对象关系扩展的一部分,实际上就是系统生成和维护的父子关系中的子表,其实在测试中大家都碰到过。比如scott模式中的emp和dept表,emp表就是被嵌套的表,因为emp表有一个指向dept的外键deptno。嵌套表与子表的主要区别就是:嵌套表不像子表(emp表)那样是独立表。
  7. 临时表(temporary table):这种表的用处还是比较大,这些表存储的是事务期间或者会话期间的数据,事务关闭后,表就清空了。临时表要根据需要从当前用户的临时表空间分配临时区段,每个会话只能看到这个会话分配的区段,从来不会看到其他任何会话中创建的任何数据。
  8. 对象表(object table):对象表是基于某种对象类型创建的。拥有非对象表没有的特殊属性,如系统会为对象表的每一行生成对象标示符ref,实际上对象表是堆组织表,索引组织表和临时表的特例,还可以包含嵌套表作为其结构的一部分。
  9. 外部表(external table):外部表中的数据并不存储在数据库中,而是放在数据库之外,如放在平常的操作系统文件中。利用外部表可以查询数据库之外的一个文件,给我们的感觉就像这个文件也是数据库中平常的表一样。

oracle中主要常用的就差不多如上9种类型的表,但在实际的工作当中,用得最多的还是堆组织表和临时表,不管是哪种类型的表,都具有如下的基本信息。

1. 一个表最多可以有1000个列,不过我相信没有哪一个架构师会在一个表中创建这么多列吧,因为在oracle内部会把列数大于254的行存储在多个单独的行段row piece中,行段之间相互指向,而且必须重新组装为完整的行镜像。

2. 行数可以说是无限的,起码oracle中没有指定限制行数,但往往会有其他限制,比如一个表空间最多允许1022个数据文件,一个数据文件最大32G,从某种意义上说,oracle限制的行数,但行数往往非常大,满足日常的需求了。

3. 表中的列有多少种排列,表就可以有多少个索引,不过另外还有基于函数的索引,隐藏索引等。

4. 理论上说在一个数据库中可以创建无数多个表,但这种往往也存在于理论中,一般还有有某种限制,但对于一个良好的系统来说,一般不可能创建很多表。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL