Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1183377
  • 博文数量: 398
  • 博客积分: 10110
  • 博客等级: 上将
  • 技术积分: 4055
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 20:01
个人简介

新博客http://www.cnblogs.com/zhjh256 欢迎访问

文章分类

全部博文(398)

文章存档

2012年(1)

2011年(41)

2010年(16)

2009年(98)

2008年(142)

2007年(100)

我的朋友

分类: Oracle

2008-01-06 21:34:48

依赖于不同的版本,Oracle一共提供了三种类型的压缩形式:

       表压缩;OLTP表压缩;键压缩;

       表压缩从10g Release 1中引入,可以在堆表上进行压缩。同时在堆表分区和物化事务上也存在。在11g Release 1中,Oracle引入了OLTP表压缩,该特征允许在OLTP环境下进行使用。

       键压缩从8i Release 1引入,可以用来压缩索引数据或者索引组织表。

       虽然实施方式不同,但是它们都使用相同的本质,在块头存储重复的值。

       使用这些形式的压缩可以大大的减少存储,并且可以潜在的减少I/O的数量,但是会消耗额外的CPU,因为解压这些数据需要CPU

 

键压缩

       什么是键压缩?

       键压缩允许一个组合索引中的列的重复值存储在一个小的符号表中,其在块头中。

       该替代会极大的节约存储空间,并且通过减少I/O提高性能。

       键压缩如何工作?

       B数索引通常在其键中产生两个片,其中一个前缀列,一个后缀列(标识列)。

       如果索引是不唯一的,Oracle将自动的加rowid到列索引的结尾,ROWID用来组成唯一片。

       默认情况下,前缀列由全部的列-最后的列组成,对于非唯一索引,前缀列为全部列。

CREATE TABLE test_table (
column1     NUMBER     NOT NULL ,
column2     NUMBER     NOT NULL ,
column3     NUMBER     NOT NULL ,
column4     NUMBER ,
column5     NUMBER )
/

然后在表上创建一个唯一索引,使用COMPRESS声明压缩键:

CREATE UNIQUE INDEX test_idx1  ON test_table(column1,column2,column3) COMPRESS
/

前缀键将在column1column2上创建,也可以声明压缩的列数:

CREATE UNIQUE INDEX test_idx1  ON test_table(column1,column2,column3) COMPRESS 1
/

       键压缩有用的地方?

       B Tree索引和IOT表能够获益,位图索引以一种特定的形式压缩,但不是键压缩。键压缩仅在多个列,如复合索引,或者只有一个列的非唯一索引上获益,唯一索引则不能获得任何好处,相反,Oracle不允许在这种索引上压缩。

SQL> CREATE TABLE test_table
  2   (column1     NUMBER     NOT NULL
  3   ,column2     NUMBER     NOT NULL
  4   ,column3     NUMBER     NOT NULL
  5   ,column4     NUMBER
  6   ,column5     NUMBER
  7   )
  8  /

Table created.

SQL> CREATE UNIQUE INDEX test_idx1 ON test_table(column1)
  2  COMPRESS
  3  /
compress
*
ERROR at line 2:
ORA-25193: cannot use COMPRESS option for a single column key

键压缩的好处和坏处?

键压缩的好处:

·节约页块空间;

·透明实施;

·通过减少I/O提高性能。

       但是需要考虑的是会增加CPU时间。

 

OLTP表压缩

       OLTP表压缩从Oracle 11g Release 1引入,使企业版的特征。不同的是OLTP表压缩主要用于非直接路径操作在后台执行,Oracle以一种方法实施,以批操作的模式进行,以确保最小化性能的影响。

       可以查看如下:

SQL> CREATE TABLE temp_uncompressed

  2  (col1   NUMBER        NOT NULL

  3  ,col2   VARCHAR2(128)  NOT NULL

  4  ,col3   DATE        NULL)

  5  NOCOMPRESS -- default but state it for clarity

  6  /

Table created.

 

SQL> CREATE TABLE temp_compressed_direct

  2  (col1   NUMBER        NOT NULL

  3  ,col2   VARCHAR2(128)  NOT NULL

  4  ,col3   DATE        NULL)

  5  COMPRESS FOR DIRECT_LOAD OPERATIONS

  6  /

 

Table created.

 

SQL> CREATE TABLE temp_compressed_all

  2  (col1   NUMBER        NOT NULL

  3  ,col2   VARCHAR2(128)  NOT NULL

  4  ,col3   DATE        NULL)

  5  COMPRESS FOR ALL OPERATIONS

  6  /

 

Table created.

 

SQL> SELECT table_name

  2  ,        compression

  3  ,        compress_for

  4  ,        pct_free

  5  FROM   user_tables

  6  WHERE  table_name IN('TEMP_UNCOMPRESSED','TEMP_COMPRESSED_ALL','TEMP_COMPRESSED_DIRECT')

  7  /

 

TABLE_NAME                     COMPRESS COMPRESS_FOR         PCT_FREE          

------------------------------ -------- ------------------ ----------          

TEMP_COMPRESSED_ALL            ENABLED  FOR ALL OPERATIONS         10          

TEMP_COMPRESSED_DIRECT         ENABLED  DIRECT LOAD ONLY            0          

TEMP_UNCOMPRESSED              DISABLED                            10

       OLTP压缩表可以通过TEMP_COMPRESSED_ALL查询到。

        

表压缩

       表压缩可以使用的地方?

       可以使用表压缩的对象包括:

       ·堆表;

       ·潜逃表;

       ·范围或列表分区;

       ·物化视图;

       不能使用压缩的对象:

       ·子分区;

       ·哈希分区;

       ·外部表;

       ·聚簇表的一部分;

       ·带LOBS的表;

       ·IOTs表;

       ·索引;

       影响压缩率的因素?

       实际使用的算法Oracle并没有透露,不过主要因素包括:

       ·块大小;

       ·块负载;

       ·重复值;

       ·重复值的列长度,需要注意,如果列值长度小于6,那么压缩将被忽略;

       ·接合数据提高重复数据相邻的角度;

       表压缩的好处和缺点?

       表压缩的好处:

       ·节约空间;

       ·减少IO

       ·透明;

       ·提高某些DML的性能删除更快,某些插入更快;

       缺点:

       ·CPU负载增加;

       ·在10g中仅在直接路径加载中可用;

       ·会降低某些DML的性能更新和某些插入;

       平衡

       不允许删除一个列,如果试图删除将会得到ORA-39726错误,但是如果使用ALTER TABLE test_table MOVE NOCOMPRESS将表转换为非压缩的则可以(至少在10.2中可以)

CREATE TABLE test_table(
column1     NUMBER     NOT NULL,
column2     NUMBER     NOT NULL,
column3     NUMBER      )   
COMPRESS

/

INSERT /*+ APPEND */
INTO test_table
  (column1, column2, column3)
  SELECT MOD(l, 1000), MOD(l, 100), 1
    FROM (select level l from dual connect by level < 100001)

SQL> ALTER TABLE test_table DROP COLUMN column3

  2  /

ALTER TABLE test_table DROP COLUMN column3

                                   *

ERROR at line 1:

ORA-39726: unsupported add/drop column operation on compressed tables

 

SQL> ALTER TABLE test_table MOVE NOCOMPRESS

  2  /

Table altered.

 

ALTER TABLE test_table DROP COLUMN column3;

Table altered

SQL> ALTER TABLE test_table DROP COLUMN column2;

 

Table altered

 

阅读(1017) | 评论(0) | 转发(0) |
0

上一篇:PLS-00653

下一篇:Oracle中lob的批加载

给主人留下些什么吧!~~