oracle table type-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 3977584
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: oracle

2006-11-20 14:32:38

在oracle中,表的类型有如下七种:

堆组织表,索引组织表,索引聚簇表,散列聚簇表,嵌套表,临时表,对象表。下面得内容只是介绍在实际应用中经常使用的表类型,详细的介绍可以看tom的expert one-on-one第六章,而以下内容,几乎99%都是源自该书,然后自己再总结整理出来的。



一、堆组织表:

存储方式随机无序的,寻找合适的地方空间进行存储,我们现在使用的表,如果没有特别指定,一般都是这种。

一个进程使用一个freelists,当该freelists用光后,不会到

另一个freelists中找空间(即使你设定了多个freelists),它

将直接提高表高水位标志,也就是说,freelists是管理高水位以下的块,以上的块只有freelist为0是才能使用。在9i以后的版本,如果采取了assm管理方式,freelists参数是不能更改的。

pctused,控制块进入freelists,加上pctfree控制块出freelists;例如:pctused 40,pctfree 10,意味着块的使用率不能超过40%

块用来更新需要保留的空间为10%,当一个块要重新增加到freelists,必须使用率是低于40%,当一个块使用率达到60%时,它不

会从freelists撤销,只要在该块使用达到90%的时候,会从freelists中撤销(因为该块的pctfree为10%)。

二、索引组织表:

数据按主码存储和排序,同索引结构一样,不过数据直接存储于主码后面。适用于信息检索、空间和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 ——iot中每行including指定列前边的列都存储到索引块中,其余列存储到溢出块中
10 overflow ——iot中行太大时允许设置另一溢出段来保存溢出的数据,同行迁移相似
11 /
table created.

索引组织表数据是有序的,当检索数据的时候能降低逻辑读和物理读。没有了pctused参数,但是考虑到overflow段时,通过

pctthreshold和pctfree来考虑块的使用


三、索引聚簇表:

存储一组表的一种方法。某些相同的列放在同一个块上。在把数据放入之前,必须需要创建“聚簇索引”。聚簇索引的工作时拿走
一个聚簇码值,并且返回包含那个码的块的块地址。当检索数据的时候,oracle将读聚簇码,确定块地址,然后读数据。创建语法
如下:

sql> create cluster test(id number)size 1024;
cluster created.

---上面1024表示每个聚簇码的大小,如果数据块是8k,那么一个数据块将最大容纳7个聚簇码。每个聚簇存储一种值。

sql> create index idx_test_id on cluster test;
index created.

sql> create table test_10(id number,name varchar2(32)) cluster test(id);
table created.

sql> create table test_20(id number,age number(3)) cluster test(id);
table created.

cluster created.

sql> create index idx_test_id on cluster test;
index created.

sql> create table test_10(id number,name varchar2(32)) cluster test(id);
table created.

sql> create table test_20(id number,age number(3)) cluster test(id);
table created.

sql>drop index idx_test_id;
index dropped.

sql> select * from test_10 t1,test_20 t2 where t1.id=t2.id and t1.id=1;
select * from test_10 t1,test_20 t2 where t1.id=t2.id and t1.id=1
*
error at line 1:
ora-02032: clustered tables cannot be used before the cluster index is built


四、散列聚簇表

和索引聚簇表类似,不同的是使用散列函数代替聚簇索引;

五、临时表

临时表用来保存事务或会话期间的中间结果。临时表的数据只有对当前会话是可见,即使在当前会话commit数据以后也是不可见的

sql> create global temporary table temp_table_transaction on commit delete rows as
2 select *from scott.emp where 1=0;

表已创建。


sql> create global temporary table temp_table_session on commit preserve rows as

2 select *from scott.emp where 1=0;

表已创建。

sql> insert into temp_table_session select *from scott.emp;

已创建14行。

sql> insert into temp_table_transaction select *from scott.emp;

已创建14行。

sql> select session_cnt,transaction_cnt from
2 (select count(*) session_cnt from temp_table_session),
3 (select count(*) transaction_cnt from temp_table_transaction);

14 14

sql> commit;

提交完成。

sql> select session_cnt,transaction_cnt from
2 (select count(*) session_cnt from temp_table_session),
3 (select count(*) transaction_cnt from temp_table_transaction);

14 0

当断开会话,重新连接的时候会看到上面都是0,临时表比正常表产生的redo少得多,由于临时表必须产生包含数据得undo信息,所

以会产生一定数量得redo日志,update和delete产生最多得redo日志,insert和select产生得redo日志最少;

from :

--------------------

阅读(3741) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图