堆组织表中,数据以堆的方式管理。增加数据时,会使用段中找到的第一个能放下此数据的自由空间。从表中删除数据后,允许以后的INSERT和UPDATE重用这部分空间。堆(heap)是一组空间,以一种随机的方式使用。因此,无法保证按照放入表中的顺序取得数据。
有1个简单的技巧,来查看对于给定类型的表,CREATE TABLE语句中主要有哪些可用的选项。
首先,尽可能简单地创建表,然后使用DBMS_METADATA来查询这个表的定义。
tony@ORA11GR2> create table t(x int primary key, y clob);
Table created.
tony@ORA11GR2> select dbms_metadata.get_ddl( 'TABLE', 'T' ) from dual;
DBMS_METADATA.GET_DDL('TABLE','T')
------------------------------------------------------------------------
CREATE TABLE "TONY"."T"
( "X" NUMBER(*,0),
"Y" CLOB,
PRIMARY KEY ("X")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "USERS" ENABLE
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "USERS"
LOB ("Y") STORE AS BASICFILE (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING )
现在可以根据需要,修改某些参数。
对于ASSM有3个重要选项,对于MSSM有5个重要选项。随着本地管理表空间的引入(推荐做法),其余的参数已经没什么意义了。
· FREELIST: 仅适用于MSSM。
· PCTFREE:ASSM和MSSM都适用。
· PCTUSED:仅适用于MSSM。
· INITRANS:ASSM 和MSSM 都适合。为块初始分配的事务槽数。如果会对同样的块完成多个并发更新,就应该考虑增大这个值。
· COMPRESS/NOCOMPRESS:ASSM 和MSSM 都适合。
关于表压缩
Oracle压缩数据的处理基于数据库块,其本质上是通过消除在数据库块中的重复数据来实现空间节约.
Oracle比较数据块中包含的所有字段或记录,其中重复的数据只在位于数据块开始部分的记号表(Symbol Table)中存储一份,在其他行或字段出现同样的数据时,只记录一个指向记号表中相关数据的指针。
表的压缩
create table Name(
......
) compress;
alter table Name compress;
alter table Name nocompress;
查看一个表是否为压缩表:
select compression from user_table where table_name=TableName;
物化视图的压缩
create materialized view ViewName compress
as select ......;
alter materialized view ViewName compress;
分区表的压缩
create table Name (
......
) compress
partition by ......;
create table Name (
......
)
partition by ......(
partition PartName ...... compress,
partition PartName ...... compress,
partition PartName ......
);
查看分区表各分区的压缩属性:
select table_name, partition_name, compression from user_tab_partitions where table_name=TableName;
表空间的压缩
create tablespace ...... default compress;
alter tablespace ...... compress / nocompress;
当压缩属性被定义在表空间上时,在其中创建表时,该特性将被表继承,但表级别的压缩属性会覆盖表空间的压缩属性。
查看一个表空间是否被压缩:
select def_tab_compression from dba_tablespace where tablespace_name=TablespaceName;
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则只针对直接路径操作。
注意:
1) 将一个非压缩的表修改为压缩表后,
alter table xxx compress for oltp;
表中已经存在的数据需要执行alter table xxx move来进行压缩。后续插入数据会自动压缩。
2) 单独存储在LOB段中的LOB数据并不使用表的PCTFREE/PCTUSED参数设置。这些LOB块以不同的方式管理:它们总是会填入,直至达到最大容量,而且仅当完全为空时才返回FREELIST。