压缩子句可以在表空间,表或分区一级使用下面的选项指定:
◆NOCOMPRESS - 表或分区不压缩,当没有具体指定压缩子句时这是默认行为。
◆COMPRESS - 这个选项被认为适合于数据仓库系统,只在直接路径插入过程中在表或分区上启用压缩。
◆COMPRESS FOR DIRECT_LOAD OPERATIONS - 这个选项与COMPRESS关键字有同样的影响。
◆COMPRESS FOR ALL OPERATIONS - 这些选项被认为适合于OLTP系统,如名字暗示的那样,这些选项为所有操作启用了压缩,包括普通的DML语句,这个选项需要COMPATIBLE初始化参数设置为11.1.0或更高。
下面的例子展示了在表和分区一级应用多个压缩选项。
-- Table compression. CREATE TABLE test_tab_1 ( id NUMBER(10) NOT NULL, description VARCHAR2(50) NOT NULL, created_date DATE NOT NULL ) COMPRESS FOR ALL OPERATIONS;
-- Partition-level compression. CREATE TABLE test_tab_2 ( id NUMBER(10) NOT NULL, description VARCHAR2(50) NOT NULL, created_date DATE NOT NULL ) PARTITION BY RANGE (created_date) ( PARTITION test_tab_q1 VALUES LESS THAN (TO_DATE('01/01/2008', 'DD/MM/YYYY')) COMPRESS, PARTITION test_tab_q2 VALUES LESS THAN (TO_DATE('01/04/2008', 'DD/MM/YYYY')) COMPRESS FOR DIRECT_LOAD OPERATIONS, PARTITION test_tab_q3 VALUES LESS THAN (TO_DATE('01/07/2008', 'DD/MM/YYYY')) COMPRESS FOR ALL OPERATIONS, PARTITION test_tab_q4 VALUES LESS THAN (MAXVALUE) NOCOMPRESS );
|
表级压缩设置反映在[dba|all|user]_tables视图中的COMPRESSION和COMPRESS_FOR列。
SELECT table_name, compression, compress_for FROM user_tables;
TABLE_NAME COMPRESS COMPRESS_FOR ------------------------------ -------- ------------------ TEST_TAB_1 ENABLED FOR ALL OPERATIONS TEST_TAB_2
2 rows selected.
SQL>
|
没有使用表级压缩的话这些列将显示NULL值。
分区级压缩设置反映在[DBA|ALL|USER]_TAB_PARTITIONS视图中的COMPRESSION和COMPRESS_FOR列。
SELECT table_name, partition_name, compression, compress_for FROM user_tab_partitions;
TABLE_NAME PARTITION_NAME COMPRESS COMPRESS_FOR ------------------------------ ------------------------------ -------- ------------------ TEST_TAB_2 TEST_TAB_Q1 ENABLED DIRECT LOAD ONLY TEST_TAB_2 TEST_TAB_Q2 ENABLED DIRECT LOAD ONLY TEST_TAB_2 TEST_TAB_Q3 ENABLED FOR ALL OPERATIONS TEST_TAB_2 TEST_TAB_Q4 DISABLED
4 rows selected.
SQL>
|
可以使用alter table命令修改表和分区的压缩设置,修改对现有的数据没有影响,只对应用到表上的新操作有影响。
ALTER TABLE test_tab_1 NOCOMPRESS;
ALTER TABLE test_tab_2 MODIFY PARTITION test_tab_q4 COMPRESS FOR ALL OPERATIONS;
使用create tablespace和alter tablespace命令可以修改表空间级的默认压缩设置,当前的设置显示在DBA_TABLESPACES视图的DEF_TAB_COMPRESSION和COMPRESS_FOR列中。
CREATE TABLESPACE test_ts DATAFILE '/u01/app/oracle/oradata/DB11G/test_ts01.dbf' SIZE 1M DEFAULT COMPRESS FOR ALL OPERATIONS;
SELECT def_tab_compression, compress_for FROM dba_tablespaces WHERE tablespace_name = 'TEST_TS';
DEF_TAB_ COMPRESS_FOR -------- ------------------ ENABLED FOR ALL OPERATIONS
1 row selected.
SQL>
ALTER TABLESPACE test_ts DEFAULT NOCOMPRESS;
SELECT def_tab_compression, compress_for FROM dba_tablespaces WHERE tablespace_name = 'TEST_TS';
DEF_TAB_ COMPRESS_FOR -------- ------------------ DISABLED
1 row selected.
SQL>
DROP TABLESPACE test_ts INCLUDING CONTENTS AND DATAFILES;
|
在多级指定了压缩设置时,总是使用最详细的设置,如:分区设置总是覆盖表设置,表设置总是覆盖表空间设置。
表压缩有关的限制包括:
◆压缩表如果使用了COMPRESS FOR ALL OPERATIONS选项,它只能添加或删除列。
◆压缩表必须有多余255列。
◆压缩不能应用于lob段。
◆表压缩只对堆组织表有效,对索引组织表无效。
◆压缩子句不能应用于哈希分区或哈希-列表分区,相反,它们必须从表空间、表或分区设置中继承它们的压缩设置。
◆表压缩不能指定给扩展表或群集表。