`
足至迹留
  • 浏览: 485555 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

<oracle-9> 数据库表

阅读更多
9.1 表类型
Oracle主要有以下9种表类型:
(1) 堆组织表(heap organized table):这些就是普通的标准数据库表。数据以堆的方式管理。增加数据时,会使用段中找到的第一个能放下此数据的自由空间。从表中删除数据时允许以后的insert和update重用这部分空间
(2) 索引组织表(index organized table):这些表按索引结构存储。这就强制要求行本身有某种物理顺序。在堆中,只要放得下数据就可以放在任何位置;而索引组织表,数据要根据主键有序地存储
(3) 索引聚簇表(index clustered table):聚簇(cluster)是指一个或多个表组成的组,这些表物理地存储在相同的数据库块上,有相同聚簇键值的所有行会相邻的物理存储。这些数据按聚簇键值聚簇在一起,聚簇键使用B*树索引建立。
(4) 散列聚簇表(hash cluster table):这些表类似于聚簇表,但是不使用B*树索引按聚簇键来定位数据,散列聚簇将键散列到聚簇上,从而找到数据应该在哪个数据块上。在散列聚簇中,数据就是索引,如果需要频繁地通过键的相等性比较来读取数据,散列聚簇表就很适用。
(5) 有序散列聚簇表(sorted hash clustered table):这种表类型是oracle 10g中新增的,它结合了散列聚簇表的某些方面。
(6) 嵌套表(nested table):嵌套表是oracle对象关系扩展的一部分。他们实际上就是系统生成和维护的父/子关系中的子表。嵌套表与子表的主要区别是:嵌套表不像子表那样是独立表。
(7) 临时表(temporary table):这些表存储的是事务期间或会话期间的草稿数据。临时表要根据需要从当前用户的临时表空间分配临时区段。每个会话只能看到这个会话分配的区段。
(8) 对象表(object table):对象表基于某种对象类型创建。他们拥有非对象表所没有的特殊属性,如系统会为对象表的每一行生成对象标识符。对象表实际是堆组织表,索引组织表和临时表的特例,还可以包含嵌套表作为其结构的一部分。
(9) 外部表(external table):这些表中的数据并不存储在数据库本身中,而是放在数据库外,即放在平常的操作系统文件中。

不论哪种类型的表,都有以下基本信息:
(1) 一个表最多可以有1000列。不过除非存在某个硬性要求,不鼓励设计中真的包含那么多列。Oracle在内部会把列数大于254的行存储在多个单独的行段,这些行段相互指向,而且必须重新组装为完整的行映像。表中的列数远远少于1000列时才最高效。
(2) 表的行数几乎是无限的,不过你可能会遇到其他的某个限制。
(3) 表中的列有多少种排列,表就可以有多少个索引。随着基于函数的索引的出现,理论上说,所能创建的索引数是无限的。
(4) 在一个数据库中可以有无限多个表

9.2 术语
9.2.1 段
Oracle中的段(segment)是占用磁盘上存储空间的一个对象。有多种段类型:
(1) 聚簇(cluster):这种段类型能存储表。有两种类型的聚簇:B*树聚簇和散列聚簇
(2) 表(table):表段保存一个数据库表的数据,这可能是最常用的段类型,通常与索引段联合使用。
(3) 表分区(table partition)或子分区(subpartition):这种段类型用于分区,与表段很类似。分区表由一个或多个表分区段组成,组合分区表则由一个或多个表子分区段组成。
(4) 索引(index):这种段类型可以保存索引结构。
(5) 索引分区(index partition):类似于分区表,这种段类型包含一个索引的某个片。分区索引由一个或多个索引分区段组成。
(6) Lob分区(lob partition)、lob子分区(lob subpartition)、lob索引和lob段:lob索引和lob段是保存大对象的结构。
(7) 嵌套表(nested table):这是为嵌套表指定的段类型。
(8) 回滚段(rollback)和type2 undo段:undo数据就存储在这里。回滚段是DBA手动创建的段,Type2 undo段是由oracle自动创建和管理的。

考虑一下这个简单的create语句:
create table t(x int primary key, y clob, z blob);

这个语句会创建6个段。表本身创建一个段。主键约束创建一个索引段。

注意: 唯一约束或主键约束可能创建一个新索引,也可能不创建。如果约束列上已经有一个索引,而且这些列处于索引的前几列,这个约束就会使用这些列(而不再创建新索引)。
另外每个LOB字段分别创建两个段:一个用于存储字符大对象或二进制大对象所指的实际数据块,另一个段用于组织这些数据块。

9.2.2 段空间管理
Oracle 9i开始,管理段空间有两种方法:
手动段空间管理和自动段空间管理。

9.2.3 高水位线
存储在数据库中的表段使用了这个术语。例如,如果把表想像成一个平面结构,或者想象成从左到右依次排开的一系列块,高水位线(high-water mark, HWM)就是包含了数据的最右边的块:


上图显示了HWM首先位于新创建表的第一个块中,过一段时间随着这个表放入数据,HWM会升高。如果我们删除了表中的一些(甚至全部)行,可能就会有许多块不再包含数据,但是他们仍在HWM之下,而且这些块会一直保持在HWM下,直到重建,截除或收缩这个对象。
HWM很重要,因为oracle在全面扫描段时会扫描HWM之下的所有块,即使其中不包含任何数据,这会影响全面扫描的性能。特别是当HWM之下的大多数块都是空时。这时再看下,如果是delete数据,则不会改变HWM,但是使用truncate就会把表的HWM重置为0,还会截除表上的相关索引。由于以上原因,如果你打算删除表中的所有行,就应该使用truncate(如果可以使用的话),想想之前还介绍过truncate不会产生undo也是影响性能的一方面。

9.2.4 logging和nologging
通常对象都采用logging方式创建,这说明对象上完成的操作只要能生成redo就都会生成redo。Nologging则允许该对象完成某些操作时可以不生成redo。

9.2.5 initrans和maxtrans
段中每个块都有一个块首部。这个块首部有一个事务表。事务表中会建立一些条目来描述哪些事务将块上的哪些行/元素锁定。这个事务表的初始大小由对象的initrans设置指定。事务表会根据需要动态扩展,最大达到maxtrans.

9.3 堆组织表
应用中99%或者更多的情况下使用的可能都是堆组织表。执行create table语句时,默认得到的表类型就是堆组织表。如果你想要任何类型的表结构,就需要在create语句本身中指定它。

堆是计算机科学领域中得到深入研究的一种经典数据结构。它实际上就是一个很大的空间、磁盘或内存区,会以一种显然随机的方式管理。数据会放在最合适的地方,而不是某种特定顺序来放置。许多人希望能按数据放入表中的顺序从表中取出数据,但是对于堆,这时无法保证的。也就是说,我们按顺序插入一系列数据,然后select * from table查出来的顺序并不能保证跟插入的顺序一致。

全表扫描时,会按命中的顺序来获取数据,而不是以插入的顺序。这是一个必须了解的重要的数据库表概念:一般来讲,数据库表本质上是无序的数据集合
如果你的查询需要按插入的顺序来获取数据,就必须向表中增加一列,以便获取数据时使用这个列对数据排序。
应该把堆组织表看作一个很大的无序行集合。这些行会以一种看来随机的顺序取出,而且取出的顺序还取决于所用的其他选项(并行查询,不同的优化器模式等等),同一个查询可能会以不同的顺序取出数据。不要过分依赖查询得到的行顺序,除非查询有一个order by语句

9.4 索引组织表
索引组织表(index organized table, IOT)就是存储在一个索引结构中的表。存储在堆中的表是无组织的(也就是说,只要有可用的空间,数据可以放在任何地方),IOT中的数据则按主键存储和排序。
IOT有什么意义呢?实际上,可以反过来问:堆组织表有什么意义?由于一般认为关系数据库中的所有表都有一个主键,堆组织表那不就是在浪费空间吗?使用堆组织表时,我们必须为表和表主键上的索引分别留出空间。而IOT则不存在主键的空间开销,因为索引就是数据,数据就是索引,两者已经合二为一。事实上索引是一个复杂的数据结构,需要大量的工作来管理和维护,而且随着存储的行宽度有所增加,维护的需求也会增加。另一方面,相比之下,堆管理起来则很容易。堆组织表在某些方面的效率要比IOT高。

那么什么情况下需要使用IOT? 比如
(1) 表完全由主键列组成,而且所有的查询都使用到了第一列。也就是说所有表字段都是联合索引的一部分,而且查询总是要走索引。
(2) 另一个就是代码查找表。比如,要从zip_code查找state。此时可以不要堆表,而只使用IOT本身。如果你只会通过主键来访问一个表,这个表可能就非常适合实现为IOT。
(3) 如果你想保证数据存储在某个位置上,或者希望数据以某种特定的顺序物理存储,IOT就是一种合适的结构。

9.5 索引聚簇表
许多人都容易把oracle中的“聚簇”与sqlserver或sybase中的“聚簇索引”相混淆。聚簇(cluster)是指:如果一组表由一些共同的列,则将这样一组表存储在相同的数据块中;聚簇还表示把相关的数据存储在同一个块上。Sqlserver中的聚簇索引(cluster index)则要求行按索引键有序的方式存储,这类似于前面所述的IOT。利用聚簇,一个块可能包含多个表的数据。从概念上讲,这是将数据“预联接”地存储。聚簇还可以用于单个表,可以按某个列将数据分组存储。例如,部门10的所有员工都存储在同一个块上(或者如果一个块放不下,则存储在尽可能少的几个块中)。聚簇并不是有序的存储数据(这是IOT的工作),它是按某个键以聚簇方式存储,但数据存储在堆中。

9.6 散列聚簇表
散列聚簇表(Hash clustered table)在概念上与前面介绍的索引聚簇表非常相似,只是一个主要区别:聚簇键索引被一个散列函数所取代。表中的数据就是索引,这里没有物理索引。Oracle会取得一行的键值,使用某个内部函数或者你提供的某个函数对其计算散列。然后使用这个散列值得出数据应该在磁盘上的哪个位置。不过,使用散列算法来定位数据有一个副作用,如果不向表增加一个传统索引,将无法对散列聚簇中的表完成区间扫描。在一个索引聚簇中,如果有以下查询:
Select * from emp where deptno between 10 and 20;
它就能利用聚簇索引来找到这些行。在一个散列聚簇中,这个查询会导致一个全表扫描,除非deptno列上已经有一个索引。

9.7 有序散列聚簇表
有序散列聚簇是oracl 10g中新增的。其中不仅有前面所述的散列聚簇的有关性质,还结合了IOT的一些性质。

9.8 嵌套表
嵌套表(nested table)是oracle对象关系扩展的一部分。这是数据元素的一个无序集,所有数据元素的数据类型都相同,可以是一个内置数据类型,也可以是一个对象数据类型。不过还不仅如此,因为设计嵌套表是为了制造一个假象,好像父表中的每一行都有其自己的子表。如果父表中有100行,那么就有100个虚拟的嵌套表。但实际来讲,物理上只有一个父表和一个子表。在嵌套表和父/子表之间还存在一些显著的语法和语义差别。
使用嵌套表有两种方法。一种方法是在pl/sql代码中使用,用来扩展pl/sql语言。另一种方法是作为一种物理存储机制,持久的存储集合。Tom总是在pl/sql中使用嵌套表,而从未将嵌套表用作持久存储机制。

9.9 临时表
临时表(temporary table)用于保存事务或会话期间的中间结果集。临时表中保存的数据只对当前会话可见,所有会话都看不到其他会话的数据;即使当前会话已经提交了数据,别的会话也看不到它的数据。对于临时表,不存在多用户并发问题,因为一个会话不会因为使用一个临时表而阻塞另一个会话。
  • 大小: 96.3 KB
0
0
分享到:
评论

相关推荐

    <<Oracle数据库>>,赵明渊主编 , 数据库材料

    这是&lt;&lt;Oracle数据库教程&gt;&gt;数据库材料,一转换为SQL server数据库, 用它来练习T-SQL 查询语句;

    C#通用数据库访问类 常用6种数据库VS2008

    通用数据库访问类 通过配置 可实现不同数据库的的访问&def目前实现了SQLserver&def Oracle&def DataAccess &lt;!--在配置文件中加如下--&gt; &lt;?xml version="1.0" encoding="utf-8" ?&gt; &lt;configuration&gt; &lt;!-- 连接字符...

    ORACLE 10G入门与实践 Part2

    ORACLE 10G入门与实践 Part1~Part5&lt;br/&gt;&lt;br/&gt;目录:&lt;br/&gt;第1章 Oracle数据库10g概述 &lt;br/&gt;1-1 数据库和信息管理&lt;br/&gt;1-2 Oracle 10g服务器&lt;br/&gt;1-3 Oracle数据库体系结构&lt;br/&gt;1-4 Oracle数据库特性&lt;br/&gt;1-5 安装...

    ORACLE 10G入门与实践 Part1

    ORACLE 10G入门与实践 Part1~Part5&lt;br/&gt;&lt;br/&gt;目录:&lt;br/&gt;第1章 Oracle数据库10g概述 &lt;br/&gt;1-1 数据库和信息管理&lt;br/&gt;1-2 Oracle 10g服务器&lt;br/&gt;1-3 Oracle数据库体系结构&lt;br/&gt;1-4 Oracle数据库特性&lt;br/&gt;1-5 安装...

    ORACLE 10G入门与实践 Part3

    ORACLE 10G入门与实践 Part1~Part5&lt;br/&gt;&lt;br/&gt;目录:&lt;br/&gt;第1章 Oracle数据库10g概述 &lt;br/&gt;1-1 数据库和信息管理&lt;br/&gt;1-2 Oracle 10g服务器&lt;br/&gt;1-3 Oracle数据库体系结构&lt;br/&gt;1-4 Oracle数据库特性&lt;br/&gt;1-5 安装...

    ORACLE 10G入门与实践 Part5

    ORACLE 10G入门与实践 Part1~Part5&lt;br/&gt;&lt;br/&gt;目录:&lt;br/&gt;第1章 Oracle数据库10g概述 &lt;br/&gt;1-1 数据库和信息管理&lt;br/&gt;1-2 Oracle 10g服务器&lt;br/&gt;1-3 Oracle数据库体系结构&lt;br/&gt;1-4 Oracle数据库特性&lt;br/&gt;1-5 安装...

    SNKIOD.sql

    &lt;--------------------只做验证----...为便于验证oracle&lt;1&gt;/&lt;2&gt;的sql语句而上传的配套sql格式数据库源文件 &lt;--------------------只做验证--------------------&gt; &lt;--------------------只做验证--------------------&gt;

    .net 通用数据库访问类(优化版)源码

    通用数据库访问类 通过配置 可实现不同数据库的的访问&def目前实现了SQLserver&def Oracle&def DataAccess 这可节略大量数据库访问代码&def配合我的代码生活成器(http://win.51aspx.com/CV/ClassGenerate/) 将极大...

    Oracle-9i的数据库服务器有6种启动的方式.doc

    Oracle-9i的数据库服务器有6种启动的方式.doc

    C#中国移动进销存管理系统(oracle) 源码

    --[endif]--&gt;根据表结构创建相关数据表,将用户表中的数据导入(或根据此内容自己定制)。 &lt;!--[if !supportLists]--&gt;2、 &lt;!--[endif]--&gt;打开Web.config文件,修改其中的“dsn”数据库链接,修改为数据库所在的数据...

    Oracle-新建Oracle数据库并连接(图文,详细).docx

    Oracle-新建Oracle数据库并连接(图文,详细).docx

    hibernate配置

    &lt;property name="dialect"&gt;org.hibernate.dialect.Oracle9Dialect&lt;/property&gt; &lt;!--数据库方言(数据库类型)--&gt; &lt;property name="connection.driver_class"&gt;oracle.jdbc.driver.OracleDriver&lt;/property&gt; &lt;!--...

    循序渐进Oracle----数据库管理、优化与备份恢复.pdf

    循序渐进Oracle----数据库管理、优化与备份恢复.pdf

    用java写的一个数据库连接池

    自己开发的一个数据库连接池,包含代码,在oracle测试了一下,请各位对代码指正。 使用的方法如下: 1.在工程里面加入以下jar文件:mydatasource.jar,dom4j.jar,ojdbc14.jar 2.在工程目录任意位置放入连接池配置文件...

    <<Oracle 10g数据库入门与实践>>源代码

    &lt;&lt;Oracle 10g数据库入门与实践&gt;&gt;源代码,介绍Oracle 10g数据库的很少,找了很多地方才找到,希望对有需要的朋友有用

    java定时执行sql语句

    config/sql.txt 中指定需要定时执行的sql语句,使用&lt;&lt;-sql-&gt;&gt;分隔各语句。如: update deviceInfo set ps=1 where status=1 &lt;&lt;-sql-&gt;&gt; delete from deviceInfo set ps=1 where status=0 &lt;&lt;-sql-&gt;&gt; update deviceInfo...

    数据库连接字符串

    &lt;res-ref-name&gt;jdbc/oracle&lt;/res-ref-name&gt; //引用名称,对应context.xml中resource的name值 &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt; //引用类型 &lt;res-auth&gt;Container&lt;/res-auth&gt; //引用创建者 &lt;/resource-...

    Oracle-12c数据库基础教程-Oracle-12c数据库ADO.NET数据访问技术完整.pptx

    Oracle-12c数据库基础教程-Oracle-12c数据库ADO.NET数据访问技术完整.pptx

    ojdbc6--oracle数据库连接驱动.rar

    ojdbc6----oracle 数据库连接驱动,亲测可用,需要的朋友可以下载.oracle 数据库连接驱动,

    Oracle-12c数据库基础教程-Oracle-12c数据库管理、配置和维护PPT文档.pptx

    Oracle-12c数据库基础教程-Oracle-12c数据库管理、配置和维护PPT文档.pptx

Global site tag (gtag.js) - Google Analytics