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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-686408/