ORACLE数据库表概述

在这一章中,我们将讨论各种类型的数据库表,并介绍什么情况下想用哪种类型的数据库表(也就是说,在哪些情况下某种类型的表比其他类型更适用)。我们会强调表的物理存储特征:即数据如何组织和存储。 


从前只有一种类型的表,这千真万确,原先确实只有一种“普通”表。管理这种表就像管理“一个堆”一样(下一节会给出有关的定义) 。后来,Oracle又增加 了几类更复杂的表。如今,除了堆组织表外,还有聚簇表(共有3种类型的聚簇表)、索引组织表、嵌套表、临时表和对象表。每种类型的表都有不同的特征,因此 分别适用于不同的应用领域。 


10.1 表类型 

在深入讨论细节之前,我们先对各种类型的表给出定义。Oracle中主要有9种表类型: 


 堆 组织表(heap organized table):这些就是“普通”的标准数据库表。数据以堆的方式管理。增加数据时,会使用段中找到的第一个能放下此数据的自由空间。从表中删除数据时,则 允许以后的INSERT和UPDATE重用这部分空间。 这就是这种表类型中的“堆”这个名词的由来。堆(heap)是一组空间,以一种有些随机的方式使 用。 


 索引组织表(index organized table):这些表按索引结构存储。这就强制要求行本身有某种物理顺序。在堆中,只要放得下,数据可以放在任何位置;而索引组织表(IOT)有所不同,在IOT中,数据要根据主键有序地存储。 


索 引聚簇表(index clustered table):聚簇(cluster)是指一个或多个表组成的组,这些表物理地存储在相同的数据库块上,有相同聚簇键值的所有行会相邻地物理存储。这种结 构可以实现两个目标。首先,多个表可以物理地存储在一起。一般而言,你可能认为一个表的数据就在一个数据库块上,但是对于聚簇表,可能把多个表的数据存储 在同一个块上。其次,包含相同聚簇键值(如DEPTNO=10)的所有数据会物理地存储在一起。这些数据按聚簇键值“聚簇”在一起。聚簇键使用B*树索引 建立。 


 散 列聚簇表(hash clustered table):这些表类似于聚簇表,但是不使用B*树索引聚簇键来定位数据,散列聚簇将键散列到聚簇上,从而找到数据应该在哪个数据库块上。在散列聚簇 中,数据就是索引(这是隐喻的说法)。如果需要频繁地通过键的相等性比较来读取数据,散列聚簇表就很适用。 


有 序散列聚簇表(sorted hash clustered table):这种表类型是Oracle 10g 中新增的,它结合了散列聚簇表的某些方面,同时兼有IOT的一些方面。其概念如下:你的行按某个键值(如CUSTOMER_ID)散列,而与该键相 关的一系列记录以某种有序顺序到达(因此这些记录是基于时间戳的记录),并按这种有序顺序处理。例如,客户在你的订单输入系统中下订单,这些订单会按先进 先出(first in, first out, FIFO)的方式获取和处理。在这样一个系统中,有序散列聚簇就是适用的数据结构。 


嵌 套表(nested table):嵌套表是Oracle对象关系扩展的一部分。它们实际上就是系统生成和维护的父/子关系中的子表。嵌套表的工作类似于SCOTT模式中的 EMP和DEPT。可以认为EMP是 DEPT表的子表,因为EMP表有一个指向DEPT的外键DEPTNO。嵌套表与子表的主要区别是:嵌套表不像子表 (如EMP)那样是“独立”表。 

 临时表(temporary table):这些表存储的是事务期间或会话期间的“草稿”数据。临时表要根据需要从当前用户的临时表空间分配临时区段。每个会话只能看到这个会话分配的区段;它从不会看到其他任何会话中创建的任何数据。 


 对象表(object table):对象表基于某种对象类型创建。它们拥有非对象表所没有的特殊属性,如系统会为对象表的每一行生成REF(对象标识符)。对象表实际上是堆组织表、索引组织表和临时表的特例,还可以包含嵌套表作为其结构的一部分。 


外 部表(external table):这些表并不存储在数据库本身中,而是放在数据库之外,即放在平常的操作系统文件中。在Oracle9i及以上版本中,利用外部表可以查询数 据库之外的一个文件,就好像这个文件也是数据库中平常的表一样。外部表对于向数据库加载数据最有用(外部表是非常强大的数据加载工具)。Oracle 10g则更进一步,还引入了一个外部表卸载功能,在不使用数据库链接的情况下,这为在Oracle数据库之间移动数据提供了一种简单的方法。


不论哪种类型的表,都有以下一般信息:

 

一 个表最多可以有1000列,不过我不鼓励设计中真的包含这么多列,除非存在某个硬性需求。表中的列数远远少于1000列时才最有效。Oracle在内部会 把列数大于254的行存储在多个单独的行段(row piece)中,这些行段相互指向,而且必须重新组装为完整的行影像。 


  表 的行数几乎是无限的,不过你可能会遇到另外某个限制,使得这种“无限”并不实际。例如,一般来讲,一个表空间最多有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行。确实存在着上限,但是在接近这些上限之前,你肯定会遇到另外某个实际限制。 


 表中的列有多少种排列(以及这些列的函数有多少种排列),表就可以有多少个索引。随着基于函数的索引的出现,理论上讲,说能创建的索引数是无限的!不过,同样由于存在一些实际的限制,这会影响真正能创建和维护的索引数。


 即使在一个数据库中也可以有无限多个表。不过,还是同样的道理,实际的限制会使数据库中的表数在一个合理的范围内。不可能有数百万个表(这么多表对于创建和管理来说都是不实际的),但是有数千个表还是允许的。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值