表
表示Oracle数据库中的基本单位。
关系表
关系表是数据库中最常见的表类型,关系表是以堆的形式组织的;换句话说,表中的行没有按照任何特定的顺序存储。在create table命令中,可以指定organizaition heap来定义以堆的形式组织的表,但是因为是默认值,所以该子句可以省略。
临时表
之所以称他们为临时表,在某种意义上是因为数据存储在表中,而不是存储在自身的定义中。命令create global temporay table可以创建一个临时表。
只要其他用户具有访问表自身的权限,他们就可以在临时表上执行select命令或数据操作语言(Data Manipulation Commands,DML),例如insert,update或delete。然而,每一个用户只能在表中看到自己的数据。当用户截取临时表时,只会从表中删除它们插入的数据。
临时表有两种不同风格的临时数据:事物持续期间的临时数据和会话持续期间的临时数据。临时数据的寿命由on commit子句控制,在执行commit或rollback命令时,on commit delete rows负责删除临时表中所有行,而on commit preserve rows能够在超出事务边界后保存表中的行。然而,当用户会话终止时,临时表中所有的用户行都会被删除。
Oracle不会为临时表上的DML生成任何redo信息,但是会在撤销表空间中创建undo信息.
组织索引表
创建索引可以有效地查找表中特有的行.然而,创建索引将会带来额外的一些系统开销,因为数据库必须同时维护表的数据行和索引条目.如果表包含的列不是很多,并且对表的访问主要集中在某一列上,可以采用索引组织表(IOT).IOT以B-树索引的形式存储表中的行,其中B-树索引的每个节点都包含作为键的(索引)列以及一个或多个非索引列.
IOT最明显的优点在于只需要维护一个存储结构,而不是两个.类似的,表的主键的值只在IOT中存储一次,而在普通表中则需要存储两次.
IOT表也有一些缺点.有些表,例如记录事件的表,可能不需要主键,或者某些情况下不需要任何键,而IOT表则必须有主键.同时IOT不可以是集群的成员.最后,如果表中有大量的列,并且在检索的时候需要频繁的访问许多列,则IOT可能不是最佳的解决方案.
对象表
对象表具有自身就是对象或类型定义实例化的行.可以通过对象ID(OID)引用对象中的行,这与关系表中的主键形成对比.
外部表
外部表允许用户访问数据源,例如文本文件,就如同该数据源是数据库中的表一样.表的元数据存储在Oracle数据字典中,但表的内容存储在外部.
外部表的定义包含两个部分.第一部分是从数据库用户的角度观察的表定义.该定义类似于在create table语句中看到的一般定义.
第二部分用于区分外部表和普通表.这是数据库列和外部数据源之间产生映射的位置:数据元素开始哪些列,列宽是多少,以及外部列的格式是字符还是二进制.外部表ORACLE_LOADER的默认类型的语法实际上等同于SQL*Loader中控制文件的语法.这是外部表的一个优点,用户只需要知道如何访问标准数据库以获得外部文件.
集群表
如果经常同时访问两个或多个表,则创建集群表可能是一种较好的方法,它可以改进引用这些表的查询功能.将具有相关式项记录在相同的块中,从而减少检索订单和行式信息所需的I/O量.
散列集群
作为特殊类型的集群表,散列集群操作起来非常类似于普通集群表,但是,散列集群没有使用集群索引,而是使用散列函数来存储并检索表中的行.在创建表时,将根据在创建集群期间指定的散列键的数量分配所需要的预估空间量
create cluster order_cluster(order_number number(6))
size 50
hash is order_number hashkeys 1000000;
create table cust_order (
order_number number(6) primary key,
order_date date,
custom_number number)
cluster order_cluster(order_number);
使用相等比较从表中选择行时,散列集群具有性能方面的优点,如下:
select order_number,order_date from cust_order where order_number=1542545;
一般情况下,如果hashkeys的数量足够并且包含散列函数的hash is字句产生均匀分布的散列键,那么这种查询在检索行时将只使用一次I/O.
排序的散列集群
它类似于普通的散列集群,通过使用散列函数来定位表中的行.然而,除此之外,排序的散列集群允许对表中的行根据表的一列或多列进行升序排列.
如果遇到先进先出处理的应用程序,该方法就可以更快的处理数据. 使用和普通集群表相同的语法可以创建排序的散列集群,但需要在集群中的列定
义后面加上sort位置参数.
create table order_detail(
order_number number,
order_timestamp timestamp sort,
customer_number number)
cluster order_detail_cluster (
order_number,
order_timestamp);
基于排序散列集群的FIFO特性,通过order_number访问订单时,将根据order_timestamp的值首先检索时间最久的订单.
分区表
对表进行分区或对索引进行分区可帮助建立更加易于管理的大型表.可以将表分区为较小的部分.从应用程序的观点来看,分区是透明的,也就是说,在终端用户的sql中不需要对任何特定分区进行显示的引用.用户唯一能够观察到的是,在where字句中使用符合区分方案的标准对分区表进行查询将运行的更快.
阅读(1677) | 评论(0) | 转发(0) |