数据库中的表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第10章数据库表
在这一章中,我们将讨论各种类型的数据库表,并介绍什么情况下想用哪种类型的数据库表(也就是
说,在哪些情况下某种类型的表比其他类型更适用)。我们会强调表的物理存储特征:即数据如何组织和存储。
从前只有一种类型的表,这千真万确,原先确实只有一种“普通”表。管理这种表就像管理“一个堆”
一样(下一节会给出有关的定义)。后来,Oracle又增加了几类更复杂的表。如今,除了堆组织表外,还有聚簇表(共有3种类型的聚簇表)、索引组织表、嵌套表、临时表和对象表。每种类型的表都有不同的特征,因此分别适用于不同的应用领域。
10.1表类型
在深入讨论细节之前,我们先对各种类型的表给出定义。Oracle中主要有9种表类型:
q 堆组织表(heap organized table):这些就是“普通”的标准数据库表。数据以堆的方式
管理。增加数据时,会使用段中找到的第一个能放下此数据的自由空间。从表中删除数据时,
则允许以后的INSERT和UPDATE重用这部分空间。这就是这种表类型中的“堆”这个名词的
由来。堆(heap)是一组空间,以一种有些随机的方式使用。
528 / 976
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)中,这些行段相互指向,而且必须重新组装为完整的行影像。
529 / 976
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 即使在一个数据库中也可以有无限多个表。不过,还是同样的道理,实际的限制会使数据库
中的表数在一个合理的范围内。不可能有数百万个表(这么多表对于创建和管理来说都是不实
际的),但是有数千个表还是允许的。
在下一节中,我们将讨论与表相关的一些参数和术语。在此之后,我们再转而讨论基本的堆组织表,
然后介绍其他类型的表。
10.2术语
在这一节中,我们将介绍与表相关的各种存储参数和术语。并非每种表类型都会用到所有参数。例
如,PCTUSED参数在IOT环境中就没有意义。具体讨论各种表类型时还会分别介绍与之相关的参数。这一节的目标时介绍这些术语,并给出定义。在后面几节中,还会在适当的时候介绍使用特定参数的更多信息。
10.2.1 段
Oracle中的段(segment)是占用磁盘上存储空间的一个对象。尽管有多种类型,不过最常见的段
类型如下:
q 聚簇(cluster):这种段类型能存储表。有两种类型的聚簇:B*树聚簇和散列聚簇。聚簇通
常用于存储多个表上的相关数据,将其“预联结”存储到同一个数据库块上;还可以用于存储
一个表的相关信息。“聚簇”这个词是指这个段能把相关的信息物理的聚在一起。