数据库表——EXPERT ONE-ON-ONE ORACLE

Tom从表的基本存储参数:FREELISTS、PCTFREE、PCTUSED、INITIAL、NEXT、PCTINCREASE、MINEXTENTS、MAXEXTENTS、LOGGING、NOLOGGING、INITRANS和MAXTRANS开始介绍,然后依次对堆表、索引组织表、聚簇表、散列聚簇表、嵌套表、临时表和对象表进行了讲解和说明。[@more@]

堆表:最常使用的普通表,数据的存储没有顺序,当增加数据时会使用Oracle找到的第一个合适空间。

索引组织表:按照主键的顺序存储数据。对于可以通过主键访问的表特别有效。但是由于索引组织表要维护主键的顺序,因此DML操作对索引组织表来说代价比堆表要大,对于频繁修改的表不适合建立为索引组织表。

聚簇表:又叫索引聚簇表。许多表包含一个相同的列,并且根据这个列存储在一起。聚簇表在物理上将数据连接在一起,对于经常连接在一起访问的表来说,聚簇表可以明显的降低I/O。不过聚簇表不适合全部扫描操作,因为不得不扫描聚簇在一起的其他表的数据。而且对聚簇表的DML操作代价比较大,因此,聚簇表也不适合频繁修改。

散列聚簇表:和聚簇表类似,不同的是散列函数替代了聚簇索引。散列聚簇表可以通过散列函数直接定位到一条记录的物理存储位置,一般情况下散列聚集只需要一次I/O就可以读取到指定的记录。但是散列聚簇不支持范围查询,因为一个范围之间存在着无数的可能性。而且散列函数的大小是预先计算好的,因此当散列聚集表数据还没有填满时,如果执行全表扫描,可能会扫描很多空的空间。散列聚簇表适合通过散列键访问且大小可以预先确定的表。

嵌套表:通过外键将父表嵌套在子表中。Tom不推荐使用这种将嵌套表作为物理存储机制,而是将其作为PL/SQL语言的一种扩展结构。对嵌套的查询和修改比普通表要复杂得多,而且嵌套表还会带来额外的存储开销。

临时表:包括两种类型,一种是基于事务的,另一种是基于会话的。临时表中的数据会在事务或会话结束后自动清除。临时表经常被用来生成中间结果集。临时表的缺点是CBO无法收集临时表的统计信息。

对象表:对象表在Oracle中用来执行对象关系模型。和嵌套表类似的是,Tom不建议使用对象表,而是利用对象视图进行替代。

=======================================================

在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日志最少;

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

转载于:http://blog.itpub.net/64429/viewspace-915831/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值