详解ORACLE簇表、堆表、IOT表、分区表簇和簇表簇其实就是一组表,是一组共享相同数据块的多个表组成。
将经常一起使用的表组合在一起成簇可以提高处理效率。
在一个簇中的表就叫做簇表。
建立顺序是:簇→簇表→数据→簇索引1、创建簇的格式CREATE CLUSTER cluster_name(column date_type [,column datatype]...)[PCTUSED 40 | integer] [PCTFREE 10 | integer][SIZE integer][INITRANS 1 | integer] [MAXTRANS 255 | integer][TABLESPACE tablespace][STORAGE storage]SIZE:指定估计平均簇键,以及与其相关的行所需的字节数。
2、创建簇create cluster my_clu (deptno number)pctused60pctfree10size1024tablespace usersstorage(initial128knext128kminextents2maxextents20);3、创建簇表create table t1_dept(deptno number,dname varchar2(20))cluster my_clu(deptno);create table t1_emp(empno number,ename varchar2(20),birth_date date,deptno number)cluster my_clu(deptno);4、为簇创建索引create index clu_index on cluster my_clu;注:若不创建索引,则在插入数据时报错:ORA-02032: clustered tables cannot be used before the cluster index is built管理簇使用ALTER修改簇属性(必须拥有ALTER ANY CLUSTER的权限)1、修改簇属性可以修改的簇属性包括:* PCTFREE、PCTUSED、INITRANS、MAXTRANS、STORAGE* 为了存储簇键值所有行所需空间的平均值SIZE* 默认并行度注:* 不能修改INITIAL和MINEXTENTS的值* PCTFREE、PCTUSED、SIZE参数修改后适用于所有数据块* INITRANS、MAXTRANS仅适用于以后分配的数据块* STORAGE参数修改后仅影响以后分配给簇的盘区格式:alter cluster my_clupctused402、删除簇drop cluster my_clu;--仅适用于删除空簇drop cluster my_clu including tables;--删除簇和簇表drop cluster my_clu including tables cascade constraints;--同时删除外键约束注:簇表可以像普通表一样删除。
散列聚簇表在簇表中,Oracle使用存储在索引中的键值来定位表中的行,而在散列聚簇表中,使用了散列函数代替了簇索引,先通过部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行。
创建散列簇需要用到HASHKEYS子句。
1、创建散列簇create cluster my_clu_two(empno number(10))pctused70pctfree10tablespace usershash is empnohashkeys150;说明:* hash is 子句指明了进行散列的列,如果列是唯一的标示行,就可以将列指定为散列值* hashkeys 指定和限制散列函数可以产生的唯一的散列值的数量2、创建散列表create table t2_emp (empno number(10),ename varchar2(20),birth_date date,deptno number)cluster my_clu_two(empno);注意:* 必须设置数值的精度(具体原因不详)* 散列簇不能也不用创建索引* 散列簇不能ALTER:size、hashkeys、hash is参数堆表1.基本概念执行CREATE TABLE语句时,默认得到的表类型就是堆组织表。
其他类型的表结构需要在CREATE TABLE语句本身中指定它。
堆组织表中,数据以堆的方式管理。
增加数据时,会使用段中找到的第一个能放下此数据的自由空间。
从表中删除数据后,允许以后的INSERT和UPDATE重用这部分空间。
堆(heap)是一组空间,以一种随机的方式使用。
因此,无法保证按照放入表中的顺序取得数据。
有1个简单的技巧,来查看对于给定类型的表,CREATE TABLE语句中主要有哪些可用的选项。
首先,尽可能简单地创建表,然后使用DBMS_METADATA来查询这个表的定义。
1.> create table t(x int primary key, y clob);2.3.Table created.4.5.> select dbms_metadata.get_ddl( 'TABLE', 'T') from dual;6.7.DBMS_METADATA.GET_DDL('TABLE','T')8.------------------------------------------------------------------------9.10.CREATE TABLE"TONY"."T"11.( "X"NUMBER(*,0),12."Y"CLOB,13.PRIMARY KEY("X")ING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOCOMPRESS LOGGING15.TABLESPACE "USERS"ENABLE16.) SEGMENT CREATION DEFERRED17.PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING18.TABLESPACE "USERS"19.LOB ("Y") STORE AS BASICFILE (20.TABLESPACE "USERS"ENABLE STORAGE IN ROW CHUNK 8192 RETENTION21.NOCACHE LOGGING )现在可以根据需要,修改某些参数。
对于ASSM有3个重要选项,对于MSSM有5个重要选项。
随着本地管理表空间的引入(推荐做法),其余的参数已经没什么意义了。
· FREELIST:仅适用于MSSM。
· PCTFREE:ASSM和MSSM都适用。
· PCTUSED:仅适用于MSSM。
· INITRANS:ASSM 和MSSM 都适合。
为块初始分配的事务槽数。
如果会对同样的块完成多个并发更新,就应该考虑增大这个值。
· COMPRESS/NOCOMPRESS:ASSM 和MSSM 都适合。
11g之前,选项是COMPRESS或者NOCOMPRESS,只有直接路径操作(例如CREATE TABLE AS SELECT, INSERT /*+ APPEND*/, ALTER TABLE T MOVE以及SQL*Loader直接路径加载)才能利用压缩。
11g之后,选项是COMPRESS FOR OLTP,COMPRESS BASIC或者NOCOMPRESS。
COMPRESS FOR OLTP 启用所有操作的压缩(包括直接路径和常规路径),COMPRESS BASIC则只针对直接路径操作。
注意:单独存储在LOB段中的LOB数据并不使用表的PCTFREE/PCTUSED参数设置。
这些LOB块以不同的方式管理:它们总是会填入,直至达到最大容量,而且仅当完全为空时才返回FREELIST。
2. 堆表总结堆表具有的唯一优点是插入数据不需要采取任何措施,只需要顺其自然地安装插入的顺序存储,减少了插入大量数据的代价。
索引组织表IOT1. 基本概念索引组织表(index organized table)简称IOT。
IOT中,数据要根据主键有序地存储。
适合使用IOT的几种情况:·表完全由主键组成或者只通过主键来访问一个表。
使用IOT,表就是索引,可以节约空间,提高效率。
·通过外键访问子表,子表使用IOT。
通过IOT将相同外键的子表数据物理的存储在同一个位置,查询所需要的物理I/O更少,因为数据都在同一个(几个)块上。
·经常在主键或者或惟一键上使用BETWEEN查询。
数据以某种特定的顺序物理存储,所以获取这些数据时所需的物理I/O更少。
查看创建IOT时候的参数选项。
1. > create table t(x int primary key, y clob) organization index;2.3.Table created.4.5. > select dbms_metadata.get_ddl( 'TABLE', 'T') from dual;6.7.DBMS_METADATA.GET_DDL('TABLE','T')8.--------------------------------------------------------------------------------9.10.CREATE TABLE"TONY"."T"11.( "X"NUMBER(*,0),12."Y"CLOB,13.PRIMARY KEY("X") ENABLE14.) ORGANIZATION INDEX NOCOMPRESS PCTFREE 10 INITRANS 2 MAXTRANS 255LOGGING15.STORAGE(INITIAL 65536 NEXT1048576 MINEXTENTS 1 MAXEXTENTS 214748364516.PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DE17.FAULT CELL_FLASH_CACHE DEFAULT)18.TABLESPACE "USERS"19.PCTTHRESHOLD 5020.LOB ("Y") STORE AS BASICFILE (21.TABLESPACE "USERS"DISABLE STORAGE IN ROW CHUNK 8192 RETENTION22.NOCACHE LOGGING23.STORAGE(INITIAL 65536 NEXT1048576 MINEXTENTS 1 MAXEXTENTS 214748364524.PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CAC25.HE DEFAULT))IOT没有PCTUSED子句,但是有PCTFREE。