ITPub博客

首页 > 数据库 > Oracle > Expert 101 Oracle——表

Expert 101 Oracle——表

原创 Oracle 作者:blue_prince 时间:2005-04-30 10:24:05 0 删除 编辑

      一、 表的类型:

    1、  堆组织表:常用的表类型,以堆的方式管理,当增加数据时,将使用段中第一个适合数据大小的空闲空间。当删除数据时,留下的空间允许以后的DML操作重用。

       2、  索引组织表:表存储在索引结构中,利用行本身排序存储。

[@more@]

      3、  聚簇表:几张表物理存储在一块,通常是同一个数据块上。包含相同聚簇码值的所有数据在物理上存储在一起,数据聚集在聚簇码周围,聚簇码用索引构建。

    4、散列聚簇表:把码散列存储到簇中,来到达数据所在的块。适用于经常等式访问的的数据。

    5、嵌套表:OOP扩展的一部分,由系统产生,以父子关系维持子表。

6、临时表:存储事务或会话中的临时数据,用以中间结果的计算,分配临时段做为存储区域。

7、对象表:根据对象类型创建,有特殊属性并且和非对象表不关联。

     一张表最多有1000列;理论上一张表有无限多行;能有和列的排列一样多的索引,且一次能够使用32个;拥有表的数量没有限制。

      二、 术语:

      1、  高水位标记(HWM):用以标识曾经包含数据的最后一个块,全表扫描时数据将检测至高水标记所在的块,不管高水标记下是否有无空闲块。DELETE不能降低HWMTRUNCATE可以。

    2、  自由列表(FREELIST):用来跟踪HWM下有空闲空间的数据块,并把其放入FREELISTS队列。在HWM上的块,只有FREELIST为空才会用到,这样ORACLE将提  高HWM并把这些块增加到FREELISTS中。如果预料到有很多并行用户将对一个对象进行大量的DML操作,可以配置多个FREELIST提高性能。

3PCTFREEPCTUSED:这两个参数用以决定什么时候数据块将放置于FREELIST中。PCTFREE表示一个块中保留多少空间用于UPDATE,当一个块中的数据达至PCTFREE的高度时,那么这个块将从FREELIST中退出。PCTUSED用以表示当块中的数据减少至占用块空间多少时,将块放入FREELIST中。PCTFREE,低PCTUSED适用于插入许多将要更新的数据,且为经常增加行的大小;低PCTFREE,高PCTUSED适用于对表只是进行DELETEINSERT的操作。

      三、 堆组织表:表中数据在随机的方式存储,哪有空间就往哪存储,不会按值的大小顺序存储。数据表是固有的无序集合。

      四、 索引组织表:数据按主码存储和排序,同索引结构一样,不过数据直接存储于主码后面。适用于信息检索、空间和OLAP程序。索引组织表的适用情况:

     1、  代码查找表。

     2、  经常通过主码访问的表。

     3、  构建自己的索引结构。

     4、  加强数据的共同定位,要数据按特定顺序物理存储。

     5、  经常用between…and…对主码或唯一码进行查询。数据物理上分类查询。如一张订单表,按日期装载数据,想查单个客户不同时期的订货和统计情况。 

索引组织表创建语法:

SQL> create table t2

  2  (x int primary key,

  3   y char(2000) default rpad('a',2000,'d'),

  4   z date

  5  )

  6  organization index  ——表示创建的表类型是IOT

  7  nocompress  ——同索引的压缩选项一样,表示是否对相同索引条目值进行压缩存储

  8  pctthreshold 50 ——当行的大小超过块大小的百分比时,超过列数据存储至溢出段

                                 9  including y  ——每行including指定列前边的列都存储到索引块中,其余列存储到溢出块

 10  overflow ——IOT中行太大时允许设置另一溢出段来保存溢出的数据,同行迁移相似

 11  /

Table created.

IOT溢出段管理:如果应用程序基本上总是使用IOT中的前N列,很少访问后面的列,那么INCLUDING将会比较适用;如果不能确定经常访问的列,那么设置PCTTHRESHOLD会更适合些。 

      五、 索引聚簇表:索引聚簇表是表相关的表共享同一数据块中的相同列,并把相关数据存储中同一个数据块上。创建索引聚簇表中最重要的是对SIZE参数有很好的估量,否则聚簇将会降低空间利用,降低效率。

    使用索引聚簇表的注意点:

     1、  如果表中数据有大量DML操作的话,那么聚簇将不适用,因为会消极地影响到DML性能。

     2、  聚簇中,全表扫描将受到影响。这是因为将扫描聚簇中不同表的数据,额外增加很多无用的数据。

     3、  如果经常TRUNCATE表和装载表的话,聚簇将不适用。聚簇中的表无法被TRUNCATE的,这是因为每个块中不只是存储一张表的数据。

     4、  如果大部分是读取操作,且通过聚簇码索引或聚簇表中其他索引来读取的话,聚簇将会比较比较适用。

 SQL> create cluster emp_dept_cluster 2  (deptno number(2)) ——用以标识聚簇列

3  size 1024 ——用来指出大约有多少字节的数据和每个聚簇码有关,ORACLE使用这个

                          4  /                     来计算每个块能容纳的最大聚簇码数目,对聚簇的空间分配至关重要 

聚簇索引存储的是每个聚簇码的值以及包含那个码的数据块的块地址。

索引聚簇加载数据应该是同时装载同一聚簇码的所有数据,而不是一次装载聚簇中不同表的数据。这是因为如果一次装载单张表数据的话,很有可能单个码值的数据大于SIZE指定的数据,但是由于聚簇码已经分配完成,此时将会聚簇码块有许多链接块,影响性能。通过一次装载每个码值对应的数据,可以更好地利用聚簇块的空间。

六、 散列(哈希)聚簇表:概念上同索引聚簇表一样,不同的是用哈希函数代替了索引聚簇码来进行数据的分配。事实上在散列聚簇中数据就是索引,因为数据决定行的物理位置。散列聚簇表中ORACLE根据行的码值,利用内部函数或提供的函数对聚簇码值进行运算,以决定数据的物理存储位置。散列聚簇通常意味着如果通过聚码访问的话,一个IO就能够提取到所需的数据。创建散列聚簇时,必须指定散列码值的数目。由于使用哈希函数来确定数据的分布,对散列聚簇表不能使用范围扫描。全扫描散列聚簇表时,不论表是否为空,ORACLE将全扫描所有块,这是因为散列聚簇中数据块都是预先分配的。散列聚簇的初始数据装载将会比较慢。自定义的散列函数限定只能使用表中可用的列和ORACLE内置函数。

散列聚簇要点:

      1、  散列聚簇通过散列码查询的时候需要的IO很少。几乎一个IO就可以提取到所需的数据,除非发生了行溢出。而传统索引至少需要2IO才能得到数据。

      2、  散列聚簇查询CPU开销大。散列聚簇是CPU密集型的,而索引是IO密集型的。

      3、  对表中数据量比较有把握,如行数,每行占用空间,有合理的上限,正确设置好HASHKYESSIZE参数,那么散列聚簇将比较适用。

      4、  散列聚簇降低DML性能。

      5、  总是经常通过HASHKEY等值访问数据。   

SQL> create cluster hash_cluster

  2  (hash_key number)

  3  hashkeys 100   ——用以标识有多少个聚簇码值,不可更改,除非重新构建

  4  size 8192  ——每个聚簇码对应的数据大概有多少字节

  5  /

Cluster created.

      散列聚簇表的大小由hashkeys关键字决定,ORACLE将用hashkeys附近最接近的素数的值(大于该数的最小素数?)为空间分配的块的数目。散列聚簇根据这些东西来预先分配空间,分配的大小为(HASHKES/trunk(blocksize/SIZE))块数。  

SQL> exec show_space('hash_cluster',user,'cluster');

Total Blocks............................104

Unused Blocks...........................2

PL/SQL procedure successfully completed.  

    可以看到占用空间一共为102个块,一个块是块头用来保存段的相关信息,这样一共分配了101个块,符合(100/trunc(8192/8192))最近的一个素数的要求。

      七、 嵌套表:嵌套表是ORACLE对象扩展的一部分,是ORACLE两种集合类型中的一种,和关系模式中传统的父子表中的子表相似。可以看作父表中每一行都拥有一个自己的表。一般在PL/SQL程序中作为扩展PL/SQL语言(多数情况下使用),有就是作为永久存储机制(很少用)。

      八、 临时表:临时表用来保存事务或会话期间的中间结果。临时表中的数据对其他会话是不可见的。临时表不用考虑并行性,多个会话并行操作不受影响。临时表的存储空间为使用用户对应的临时表空间,如果执行会过程等程序的话,那么将使用创建者的临时表空间。 

        临时表的特点:

     1、  不能用作参照完事性约束。不能创建外键。

     2、  不能有VARRAYNESTED TABLE类型的表。

     3、  不能是索引组织表,不能是聚簇表,不能分区。

     4、  不能通过analyze分析产生统计信息,使用CBO。一种情况是不使用临时表,而是使用INLINEVIEW,会使用基表的统计信息,从而让CBO选择优化的执行方式。还有一种情况就是了解临时表的应用,知道数据分布和数据量,DROP掉临时表,创建一张同名的永久表,加载好数据,然后收集统计信息并导出。然后DROP掉永久表,创建回临时表,导入统计信息,这样就可以使用CBO

     5、  临时表如果是单纯因为查询需要连接多表而用以消除多表连接的话,那么这是没有必要的。ORACLE多表查询不会成为瓶颈。 

  

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/60857/viewspace-797294/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 祸不单行
下一篇: 瞎说两句
请登录后发表评论 登录
全部评论

注册时间:2007-12-23

  • 博文量
    92
  • 访问量
    2216602