Oracle的表

堆表 -- 普通表
99%的应用在使用到表的时候,都是使用堆表。Heap,这是一个无序的空间,插入的数据会找到一个合适的位置来存储,带有随机性,而不是按插入的顺序来存储。所以,在全表扫描的时候,返回的数据是按照空间检索的顺序来找到并返回记录。
 
索引组织表
和堆表相比起来,索引组织表的所有的数据都是保存在索引的数据结构里面,存在索引段里面而非表段,所有的数据插入都是有序的放置在指定的连续的块,索引就是数据。这样做的好处就是在通过主键索引查询的时候,能够获得更快的查询速度。代价则是由于索引是很复杂的数据结构,在插入新数据的时候,相比起堆表来会有很多更复杂的动作,对性能有一定的影响。
 
数据的存储更加紧密,相邻的数据都在相同的块里面,带来的好处就是减少了IO的操作,同时提高了缓存的可用性命中率。
 
创建的关键字为   organization index
 
聚簇, 聚簇表,聚簇索引的概念对比
 
聚簇是一个定义,一种数据保存的方式: 把相关联的数据放在同一个块里面。
create cluster  emp_dept_cluster (id number);  
 
聚簇表:  采用聚簇方式建立的表,和普通的表的区别是,需要定义聚簇的名字,以及相关的聚簇键
create table dept
(
id number primary,
name varcahr2(20),
location varcahr2(20)
)
cluster  emp_dept_cluster(id);
 
emp_dept_cluster:为表创建的聚簇,聚簇名
Id:  聚簇的建立是基于id的值
 
聚簇索引:
这种索引和其他索引并无太大区别,只是他指向的是一个聚簇块。 一般的索引指向的是数据块。
create index emp_dept_cluster_idex on cluster  emp_dept_cluster;
 
索引聚簇表
如果许多表有相同的列,那么这组表都保存到相同的数据块中,(A.id=B.id),等到这些个表需要进行关联的时候,就能以很小的IO代价找到这两个id列所在的块进行匹配。从概念上讲是对表的join进行了“预链接”, 提高join的效率
另外也会把同一个表里面把数据按列分组存储,目标只有一个,那就是减少IO,加快检索的速度。
创建的方法和正常创建的区别就是在列定义后面增加了 cluster参数
 
从以上的特性可以看出,如果需要频繁修改,全表扫描,频繁Truncate 或者是需要分区的情况下,都不能使用聚簇表。
 
而只读情况下,聚簇表就很适用。
 
散列聚簇表:
 
这种聚簇表和索引聚簇表的唯一区别就在于,没有索引,他通过聚簇块里面列的值,算出一个散列值x23j87d,然后这个值来找到整个row的位置。而索引聚簇表,通过聚簇快的索引,找到相应的行的rowId.
 
创建散列聚簇:
create cluster  emp_dept_cluster (id number) hashkeys 1000;  
 
在聚簇上建表:
create table dept
(
id number primary,
name varcahr2(20),
location varcahr2(20)
)
cluster  emp_dept_cluster(id);
 
使用这种表的的一个好处,是单条数据查询,join非常快。 但是连续区间的查询就非常慢,需要进行全表扫描。
 
临时表
使用create  global temporrary table temp_table
这种表的内容只存在于回话期间,在回话结束的时候就会清理。首先在性能上非常的卓越。几乎没有redo,所以没有IO。 同时,清理表,也不需要delete语句。
所以相比使用普通表来作为临时表的方法,这种真正的临时表在性能上有着巨大的优越性。
一个使用的误区:
很多时候使用临时表的目的,把很多个查询语句的结果集放到一个临时表里面insert,最后把这个结果集select出来,进行其他的处理。这种方法没有错,但是相比起把所有的小select 语句union成一个大的select语句,然后去处理结果集,这种后者的效率要高很多。
 
外部表
数据表存储在数据库外面,就像是普通的文件一样。通常是用作想数据库加载数据。 10g以后还引入了外部表卸载功能,更加方便了数据库之间数据的移动。
 

猜你喜欢

转载自zzhonghe.iteye.com/blog/2026015