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倍)
数据和数据之间的块相差比较大的时候,读的时间比较长
想办法提高聚簇因子,比如定期对表执行重构。(有一定代价的,空闲时间做)
堆表,表和索引存储分离
优点:可以无论先后顺序的进入,在空闲的时间统计登记下就可以了。既让数据无需排队,查找的时间虽然要查询索引,再根据索引查找位置。
每个空间空闲按照一定比例来分配空间。数据的存放时没有关系
小区土地 ----> 表空间
运动场、花园(功能)-----> 段(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 subpartition;Logical rowids :存储IOT的行地址
聚簇表(聚簇因子较高的表)
方便查询、相同表的连接。犹如建立工厂集中建立,工业园区,进入工业园区也是有条件的,聚簇建立表相同。一个表只能属于一个聚簇。
单表聚簇
相同的聚簇建存储在相邻的位置上
聚簇表的更改和修改都非常麻烦,当聚簇值修改的时候则将改变物理位置。每个数据块头部存储着聚簇索引键值和ID,每行数据存储的对应的ID.
查询数值的时候就会根据聚簇索引读取多行,注意一个索引对应多行。用=号直接查找,like和between就要一直扫描到有满意条件为止。
大范围值扫数据具有相当大的优势,一行对应多列
复合表聚簇
语法: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。
插入数据的时候将表的索引置为无效,事后统一的建索引。
对于表分类型,一般的日志表,直接堆表。用于查询计算的表但没有多样化读取的表,可以适当分区。对于需要多样化读的表,对于特别的列创建索引或怎么处理
分析步骤:确定表的读取类型
衡量着是否值得采取措施
小型表---索引组织表、聚簇
中型表----无论怎么存储都会被看在是分散的方式,一定程度上没必要提高聚簇
大型表----根据读分类 :
l 单纯存储的表 --堆表 建立分区就好
l 以随机读为主的表
l 大量增加并且多样化读的数据类型 。分区、构建有效索引和确保最优化的SQl执行计划。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26742541/viewspace-745832/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26742541/viewspace-745832/