再上一篇:9.5分析 undo
上一篇:9.6小结
主页
下一篇:10.2术语
再下一篇:10.3堆组织表
文章列表

10.1表类型

Oracle 9i 10g编程艺术:深入数据库体系结构

在深入讨论细节之前,我们先对各种类型的表给出定义。Oracle中主要有9种表类型:
q 堆 组织表(heap organized table):这些就是“普通”的标准数据库表。数据以堆的 方式管理。增加数据时,会使用段中找到的第一个能放下此数据的自由空间。从表中删除数据 时,则 允许以后的INSERT和UPDATE重用这部分空间。这就是这种表类型中的“堆”这个名词 的由来。堆(heap)是一组空间,以一种有些随机的方式使 用。
q 索引组织表(index organized table):这些表按索引结构存储。这就强制要求行本身 有某种物理顺序。在堆中,只要放得下,数据可以放在任何位置;而索引组织表(IOT)有所不 同,在IOT中,数据要根据主键有序地存储。
q 索 引聚簇表(index clustered table):聚簇(cluster)是指一个或多个表组成的组, 这些表物理地存储在相同的数据库块上,有相同聚簇键值的所有行会相邻地物理存储。这种结 构可以实现两个目标。首先,多个表可以物理地存储在一起。一般而言,你可能认为一个表的 数据就在一个数据库块上,但是对于聚簇表,可能把多个表的数据存储 在同一个块上。其次, 包含相同聚簇键值(如DEPTNO=10)的所有数据会物理地存储在一起。这些数据按聚簇键值“聚 簇”在一起。聚簇键使用B*树索引 建立。
q 散 列聚簇表(hash clustered table):这些表类似于聚簇表,但是不使用B*树索引聚 簇键来定位数据,散列聚簇将键散列到聚簇上,从而找到数据应该在哪个数据库块上。在散列 聚簇 中,数据就是索引(这是隐喻的说法)。如果需要频繁地通过键的相等性比较来读取数据 , 散列聚簇表就很适用。
q 有 序散列聚簇表(sorted hash clustered table):这种表类型是Oracle 10g中新增 的,它结合了散列聚簇表的某些方面,同时兼有IOT的一些方面。其概念如下:你的行按某个 键值(如CUSTOMER_ID)散列,而与该键相 关的一系列记录以某种有序顺序到达(因此这些记 录是基于时间戳的记录),并按这种有序顺序处理。例如,客户在你的订单输入系统中下订单, 这些订单会按先进 先出(first in, first out, FIFO)的方式获取和处理。在这样一个系统 中,有序散列聚簇就是适用的数据结构。
q 嵌 套表(nested table):嵌套表是Oracle对象关系扩展的一部分。它们实际上就是系 统生成和维护的父/子关系中的子表。嵌套表的工作类似于SCOTT模式中的 EMP和DEPT。可以 认为EMP是DEPT表的子表,因为EMP表有一个指向DEPT的外键DEPTNO。嵌套表与子表的主要 区别是:嵌套表不像子表 (如EMP)那样是“独立”表。
q 临时表(temporary table):这些表存储的是事务期间或会话期间的“草稿”数据。临 时表要根据需要从当前用户的临时表空间分配临时区段。每个会话只能看到这个会话分配的区 段;它从不会看到其他任何会话中创建的任何数据。
q 对象表(object table):对象表基于某种对象类型创建。它们拥有非对象表所没有的特 殊属性,如系统会为对象表的每一行生成REF(对象标识符)。对象表实际上是堆组织表、索引 组织表和临时表的特例,还可以包含嵌套表作为其结构的一部分。
q 外 部表(external table):这些表并不存储在数据库本身中,而是放在数据库之外, 即放在平常的操作系统文件中。在Oracle9i及以上版本中,利用外部表可以查询数 据库之外 的一个文件,就好像这个文件也是数据库中平常的表一样。外部表对于向数据库加载数据最有 用(外部表是非常强大的数据加载工具)。Oracle 10g则更进一步,还引入了一个外部表卸载 功能,在不使用数据库链接的情况下,这为在Oracle数据库之间移动数据提供了一种简单的方 法。我们将在第 15章更详细地讨论外部表。
q 不论哪种类型的表,都有以下一般信息:
q 一 个表最多可以有1000列,不过我不鼓励设计中真的包含这么多列,除非存在某个硬性 需求。表中的列数远远少于1000列时才最有效。Oracle在内部会 把列数大于254的行存储在 多个单独的行段(row piece)中,这些行段相互指向,而且必须重新组装为完整的行影像。
q 表 的行数几乎是无限的,不过你可能会遇到另外某个限制,使得这种“无限”并不实际。 例如,一般来讲,一个表空间最多有1022个文件(不过,Oracle 10g中有一些新的BIGFILE表 空间,这些表空间可以超出上述文件大小限制)。假设你有一些32GB的文件,也就是说,每个 表空间有 32,704GB,就会有2,143,289,344个块,每个块大小为16KB。你可能在每个块上放
160行(每行大约80~100字节)。这样就会有 342,926,295,040行。不过,如果对这个表分 区,这个行数还能很容易地翻倍。例如,假设一个表有1024个散列分区,则能有1024×
342,926,295,040行。确实存在着上限,但是在接近这些上限之前,你肯定会遇到另外某个实际 限制。
q 表中的列有多少种排列(以及这些列的函数有多少种排列),表就可以有多少个索引。随 着基于函数的索引的出现,理论上讲,说能创建的索引数是无限的!不过,同样由于存在一些 实际的限制,这会影响真正能创建和维护的索引数。
q 即使在一个数据库中也可以有无限多个表。不过,还是同样的道理,实际的限制会使数据 库中的表数在一个合理的范围内。不可能有数百万个表(这么多表对于创建和管理来说都是不 实际的),但是有数千个表还是允许的。
在下一节中,我们将讨论与表相关的一些参数和术语。在此之后,我们再转而讨论基本的堆组织表, 然后介绍其他类型的表。