oracle表类型以及海量数据时的应用

Oracle表的类型:

1、堆组织表,(表与索引分开存储)就是普通的标准数据库表,数据以堆的方式管理。堆其实就是一个很大的空间,会一种随机的方式管理数据,数据会放在合适的地方。插入速度较快。

2、索引聚簇表 聚簇是指一个或多个表的组。有相同聚簇值的行会相邻的物理存储。oracle数据字典就大量使用这种表,这样可以将表、字典信息存储在一起,提高访问效率。如果数据只要用于读,需要频繁地把一些表的信息连结在一起访问,可以考虑索引聚簇表。但注意:聚簇会导致dml、全表扫描的效率底下,还有就是索引聚簇表是不能分区的。 =比较快,like 可能就要全部扫描

3、索引组织表,存储在一个索引结构的表。表中的数据按主键存储和排序。如果只通过主键访问一个表,就可以考虑IOT表。父子关系表中,如果是一对多关系,经常根据父表查找子表,子表可以考虑IOT表。 

4、哈希聚簇表(散列聚簇表 ),依靠哈希计算找到位置。空间下的话,容易有哈希冲突。不适合频繁增加和用等号的表

5、散列集群表(hash-clustered table)这种类型的表类似集群表,但不使用B*数索引来按群键定位数据。散列群把键散列到群已确定在其上存储数据的数据库块。在一个散列群中,数据就是索引(比喻性的这样说)。这适合于经常通过键的相等比较读取的数据。有两种类型的散列集群表,分别是:单表和多表的散列群。这里把精力集中在单表散列群上,因为集群表的例子将会说明多表群的用法。 

6、外部表(external table) 这事Oracle9i Release 1 的新类型。顾名思义,外部表提供了将数据保存在Oracle数据库外部扁平文件中的能力。不能修改这些表类型中的数据,只能查询他们。而且,不能像通常那样索引他们。  

海量数据的一般类型方案:

背景:表空间使用同操作系统的闸值技术,按比例分配空间。空闲的比例值记录在一个链表。如果数据库没有可以用来存储一行的数据连续空间,在不出现行连接的情况下,就必须执行在分配操作。设置数据块参数,pctfree.申请空间也是一个消耗。

聚簇因子oracle数据库最多可以使用5种不同大小的块(2KB/4KB/8KB/16KB/32KB))

数据相同所在的数据块

索引列值进行排序的索引行序和对应数据行序的相似性。

聚簇因子越高,读数据所要消耗的块就要少一些。(读内存中的块比读磁盘中的块快30倍)

数据和数据之间的块相差比较大的时候,读的时间比较长

想办法提高聚簇因子,比如定期对表执行重构。(有一定代价的,空闲时间做)

堆表,表和索引存储分离

优点:可以无论先后顺序的进入,在空闲的时间统计登记下就可以了。既让数据无需排队,查找的时间虽然要查询索引,再根据索引查找位置。

每个空间空闲按照一定比例来分配空间。数据的存放时没有关系

小区土地 ----&gt  表空间

运动场、花园(功能)-----&gt 段(segment

建筑物 -à对象(object )

ROWID 对象号+数据文件号(表空间为单位的相对文件号---段)+数据块号+Slot号(块中的号)虚拟地址。

设置一定的空间预留给修改的行。当行发生改变的时候可以不用修改rowid,就像一个宿舍变更床位一样,没必要通知上面这个变更。

行迁移:地址改变(较小的改变),为了使rowid不变,在原来的地址记录下新的地址。比较3次地址改变。这种需要删除行或者表重新分配空间之后才能消除。---区别于行链接:为后面的位置上链接下一个地址。

数据仓库中有一列为单位把它存放在特定的位置上。读取数据时以单列实现读取

索引组织表(IOT)(主要用于战略性,把高低频的访问的数据分开

以主键代替rowid作为地址的表。是B树索引和表不分离的表,有序的。索引组织表的数据是根据主键排序后的顺序进行排列的,这样就提高了访问的速度。 插入更新的代价比较大。

由于b树索引的只允许插入2/3的数据,出现一条数据占多行的情况比较多,容易出现溢出。适用于信息检索、空间和OLAP程序、主要使用主键查询 

好处:

Ø      不用两次访问。

Ø      能够更快访问那些频繁访问的列

Ø      ROWID伪列是基于主键值的逻辑rowid,而不是物理rowid,即使表被重新组织过,造成了基表行的迁移,二级索引仍然可用,不需要重建。 

代价:数据插入、修改的开销大

create table t88(

       ID varchar2 ( 10 ),

       NAME varchar2 ( 20 ),

       constraint pk_id primary key ( ID )

      )

    organization index

      PCTTHRESHOLD 20  ---制定一个数据块的百分比,当行数据占用大小超出时,该行的其他列数据放入溢出段  

      overflow tablespace users

      INCLUDING name ;---指定列之后的列放入溢出段,由此规定必须列后放入溢出列

  ● 如上例所示,name及之后的列必然被放入溢出列,而其他列根据 PCTTHRESHOLD 规则。 

COMPRESS子句(键压缩)

    与普通的索引一样,索引组织表也可以使用COMPRESS子句进行键压缩以消除重复值。

    具体的操作是,在organization index之后加上COMPRESS n子句

 n的意义在于:指定压缩的列数。默认为无穷大。

    例如对于数据(1,2,3)(1,2,4)(1,2,5)(1,3,4)(1,3,5)

    若使用COMPRESS则会将重复出现的(1,2)(1,3)进行压缩

若使用COMPRESS 1时,只对数据(1)进行压缩

注意:

     rowid Physical rowids:存储ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartitionLogical rowids :存储IOT的行地址 

聚簇表(聚簇因子较高的表)

方便查询、相同表的连接。犹如建立工厂集中建立,工业园区,进入工业园区也是有条件的,聚簇建立表相同。一个表只能属于一个聚簇。

单表聚簇

相同的聚簇建存储在相邻的位置上

聚簇表的更改和修改都非常麻烦,当聚簇值修改的时候则将改变物理位置。每个数据块头部存储着聚簇索引键值和ID,每行数据存储的对应的ID.

查询数值的时候就会根据聚簇索引读取多行,注意一个索引对应多行。用=号直接查找,likebetween就要一直扫描到有满意条件为止。

大范围值扫数据具有相当大的优势,一行对应多列

复合表聚簇

语法:create cluster emp_dept_cluster

  ( deptno number(2) )

size 1024--每块聚簇键关联的数据大小,控制每块索引最大个数(单位:字节)

然后建立聚簇索引

create index emp_dept_cluster_idx

     on cluster emp_dept_cluster

Create table dept

(deptno .....)

Cluster 聚簇名(列名)。

一个单位聚簇存储两个或两个以上的表的聚簇结构。

图中一列部门存储多行员工。

物理位置临近,读的块较少。但还是尽量建议数据独立性,多样化连接也是重要的。

哈希聚簇

大多用于“=”查询,分布不均匀的话容易出现冲突。

语法:

  键值个数、hash函数 、大小   

索引的代价:

1、插入代价

每次插入数据块的时候要从free listh获得分配空间,如果用来存储数据行的数据块达到pctfree,则会再次要求free listh重新分配新的数据块。

聚簇插入数据提出的申请次数可能更多。100行数据最坏的情况有100次申请。

插入数据达到千行的时候数据就会有影响。插入要像索引一样找位置

2、修改代价

跟一帮堆表的代价相同

3、删除表

特别的慢,删除表的时候在聚簇上面表现相当于(delete)。比如复合聚簇,某表执行drop的时候,在每个聚簇键中删除。(drop DDL,执行删除的时候,不会把信息存入日志中)

一般:drop cluster name [including tables] [cascade constraints];

       Truncate cluster_name [reuse storage]

最常用的几个策略是:

插入数据数时插入临时的空间里面,空闲的时候在做转移。比如:append插入,在空闲的时候进行重构。

定期对表的重构,好处在于减少行链接、提高存储率、重新构造平衡的b-tree

插入数据的时候将表的索引置为无效,事后统一的建索引。

对于表分类型,一般的日志表,直接堆表。用于查询计算的表但没有多样化读取的表,可以适当分区。对于需要多样化读的表,对于特别的列创建索引或怎么处理

分析步骤:确定表的读取类型

          衡量着是否值得采取措施

小型表---索引组织表、聚簇

中型表----无论怎么存储都会被看在是分散的方式,一定程度上没必要提高聚簇

大型表----根据读分类 : 

           单纯存储的表 --堆表 建立分区就好

           以随机读为主的表

           大量增加并且多样化读的数据类型 。分区、构建有效索引和确保最优化的SQl执行计划。 

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

转载于:http://blog.itpub.net/26742541/viewspace-745832/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值