您所在的位置: 首页>>数据库>>Oracle>>

Oracle 11gR1中表压缩增强

http://database.51cto.com  2008-05-15 10:54  黄永兵  51CTO.com  我要评论(0)
  • 摘要:Oracle 9i开始引入表压缩技术,主要用于数据仓库项目节约存储空间,在11g中它已经成为一个主流特性,在OLTP数据库上的表现也让人非常满意了,除了节约存储空间外,压缩可导致I/O性能增强,减少缓冲区内存占用,使用这些优点是要付出代价的,因为压缩引起CPU开销较大,因此它不是在任何情况下都是有益的。
  • 标签:Oracle 11gR1  压缩  

【51CTO.COM独家翻译】Oracle 9i开始引入表压缩技术,主要用于数据仓库项目节约存储空间,在11g中它已经成为一个主流特性,在OLTP数据库上的表现也让人非常满意了,除了节约存储空间外,压缩可导致I/O性能增强,减少缓冲区内存占用,使用这些优点是要付出代价的,因为压缩引起CPU开销较大,因此它不是在任何情况下都是有益的。

压缩子句可以在表空间,表或分区一级使用下面的选项指定:

◆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段。
◆表压缩只对堆组织表有效,对索引组织表无效。
◆压缩子句不能应用于哈希分区或哈希-列表分区,相反,它们必须从表空间、表或分区设置中继承它们的压缩设置。
◆表压缩不能指定给扩展表或群集表。

【相关文章】

【责任编辑:莺锦 TEL:(010)68476606】

超级网管员系列大型视频专题
访问控制列表(ACL)介绍
即时通信软件(IM)安全观察
Windows注册表应用指南
深入SQL Server 2008
 
 验证码: (点击刷新验证码)   匿名发表
  • 野蛮生长

  • 作者:冯仑著
  • “地产界的思想家”冯仑纵横生意江湖20年来,第一次系统梳理出书。  三十年来中国民营企业从前公司时代发展到公司时代,21..
Copyright©2005-2008 51CTO.COM 版权所有