ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 教你如何成为Oracle 10g OCP - 第九章 对象管理(4)

教你如何成为Oracle 10g OCP - 第九章 对象管理(4)

原创 Linux操作系统 作者:tolywang 时间:2011-01-27 17:28:25 0 删除 编辑


9.4.1.2  索引组织表(IOT: Index Organized Table)

我们知道普通表都是以堆(heap)的方式来组织的,是无序的组织方式,
Oracle还提供了一种有序的表,叫做索引组织表,简称IOT表。 IOT表
上必须要有主键,IOT本身不对应segment, 表中所有的数据都存放在主
键所在索引的叶子节点中。也就是说,在索引叶子节点里的索引条目里,
不仅存放了被索引的列的值,还存放了其他列的值。

对于总的通过主键访问数据的表来说,比较适合使用IOT表,因为如果
使用普通表,通过主键索引访问表时,至少要读取两个数据块,一个是
索引块,一个是表的数据块。但是通过IOT表,因为表的数据就存放在
索引块中,只需要读取一个块即可。

IOT表是虚拟表,不过它具有普通表所有的特性,尽管IOT表的数据实际
存放在主键索引segment中,但是我们还是可以在IOT表的其他列上再次
创建索引,这种索引我们叫做二级索引。


创建IOT表:

CREATE TABLE DFMS.TEST08
(
  OWNER           VARCHAR2(30 BYTE),
  OBJECT_NAME     VARCHAR2(128 BYTE),
  SUBOBJECT_NAME  VARCHAR2(30 BYTE),
  OBJECT_ID       NUMBER,
  DATA_OBJECT_ID  NUMBER,
  OBJECT_TYPE     VARCHAR2(19 BYTE),
  CREATED         DATE,
  LAST_DDL_TIME   DATE,
  TIMESTAMP       VARCHAR2(19 BYTE),
  STATUS          VARCHAR2(7 BYTE),
  TEMPORARY       VARCHAR2(1 BYTE),
  GENERATED       VARCHAR2(1 BYTE),
  SECONDARY       VARCHAR2(1 BYTE),
  CONSTRAINT PK_IOT_TEST PRIMARY KEY (OBJECT_ID))
ORGANIZATION INDEX 
TABLESPACE LOG_IDX
PCTTHRESHOLD 10
INCLUDING  OBJECT_TYPE
OVERFLOW TABLESPACE LOG_DATA ;

假设经常需要返回的列是object_id前面的几列,则如果将object_id
后面的几列也放入索引块中的话,会比较浪费空间,于是我们可以通过
设置pctthreshold及including属性,从而只在索引块中存放object_id
及前面的字段,后面的存在所谓overflow中(overflow是一种segment).

pctthreshold:  object_id及前面的字段总大小是200 Bytes, 索引块
大小是8KB, 那么 200/8192=2.4% ,可以设置为3 .

including object_type 表示从object_type开始后面所有的列都放入
overflow中(包括object_type)。

pctthreshold和including比较,pctthreshold优先级比较高,如果实际
值已经超过了pctthreshold,那么没有指定放入overflow的列也会放入
overflow . 

 

9.4.1.3  簇表(Cluster Table)

对于簇表,总是要先创建簇段(cluster segment),然后将表关联到cluster
segment, 它也是虚拟表,没有对应的segment, 簇表对应的是cluster
segment。  类型有两种: 索引簇表和哈希簇表 。

索引簇表中,簇上必须有一个索引。它主要用于总是进行主明细表关联查询
的表,主表和明细表根据关联字段,将数据同时放入同一个簇数据块中,即
一个数据块存放了两个表的记录,当关联查询时只需要扫描一个块即可,
示例如下:

a. 创建簇段 :
  create cluster orders(ordno number) ;
b. 创建簇上的索引:
  create index idx_orders on cluster orders ; 
c. 创建表,并关联到cluster .
   主表:
   create table order_master (ordno number, cstid number,createdate date)
   cluster orders (ordno); 
   明细表:
   create table order_item (ordno number, skuid number, qty number) 
   cluster orders (ordno); 


哈希簇表中,则是将表的记录插入簇段的时候,对簇所在的列运用哈希函数,
从而得到记录所在的数据块的位置,不能那个关联多个表,只能将一个表关联
到哈希簇段中。
create cluster phone_cst(phone_no number) hashkeys 1000 size 50 ;
备注: phone_no值最多不超过1000,每个hashkeys能使用的空间大小是50字节 .
create table phones(phone_no number, name varchar2(10)) cluster phone_cst(phone_no);

 


9.4.1.4  临时表(Temporary Table)

临时表存放的数据都是暂时使用的,用完后需要删除的,临时表的数据是"session"
专用的,当前session只能看到它自己修改的数据,即使其他session提交了它们自己
的DML操作。临时表就好像每个session单独使用一样。

因为临时表的数据就像session专用一样,因此也就不需要消耗DML锁资源,建立好临时
表以后,还可以在临时表上创建索引,约束及触发器等。

Oracle自动清除临时表中数据的两种方式:
a. 退出session时,即用户终端数据库连接时,自动清除与该session相关的数据,
通过 on commit preserve rows 设置 。
b. 用户提交或回滚时,自动清除与该session相关的,位于临时表中的数据。通过
短语 on commit delete rows 设置。

例子:

CREATE GLOBAL TEMPORARY TABLE DFMS.SYS_T_OTS_TRACE_DETAIL
(
  SYSSERIALNO             VARCHAR2(25 BYTE),
  NEXTEVENT               VARCHAR2(35 BYTE),
  SPAM_FLAG               VARCHAR2(1 BYTE),
  HOLD_STN                VARCHAR2(25 BYTE)
)
ON COMMIT PRESERVE ROWS
NOCACHE;


CREATE INDEX DFMS.IDX1_T_OTS_TRACE_DETAIL ON DFMS.SYS_T_OTS_TRACE_DETAIL
(SYSSERIALNO);

我们可以通过user_tables视图查看DURATION字段,如果是SYS$SESSION说明是
session中断时删除数据,而SYS$TRANSACTION 则表示提交或回滚时删除数据。

 

下一节 :  索引

 

 

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

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13470175