oracle compression table internals

压缩表介绍

Oracle可在表空间、表、分区级进行压缩,如果表空间设置了压缩方式,则所有存储在该表空间的表都将默认采用相同的压缩方式,在表级也可设置的压缩方式。Oracle还支持在分区级定义不同的压缩方式,以满足不同的数据管理需求。其压缩方式分为Basic Compression、OLTP compression、Warehouse compression(HCC)和Online archival compression (HCC)。

压缩的实现

  • 当数据写入数据块时,对数据进行压缩操作
  • 当从数据块中读取数据时,对数据块的数据进行解压操作

压缩的正面影响

  • 压缩数据能让数据块存储更多的数据,从而达到节约存储空间的目的
  • 能有效的提升buffer cache命中率,从而达到减少物理和逻辑I/O请求次数的目的

压缩的负面影响

  • 压缩和解压带来的额外CPU开销

压缩方式

  • Basic Compression COMPRESS[BASIC]
  • OLTP compression COMPRESS for OLTP
  • Warehouse compression(HCC) COMPRESS for QUERY[LOW|HIGH]
  • Online archival compression (HCC) COMPRESS for ARCHIVE[LOW|HIGH]

Basic Compress

Basic Compress是9ir2版本推出的压缩技术,是基于数据块级别的,对数据块内重复的行或者重复的字段值进行压缩,但是并不是所有字段类型都是可以压缩的。

Basic Compress可压缩的类型

  • VARCHAR2
  • NUMBER
  • LONG
  • DATE
  • TIMESTAMP
  • RAW
  • LENGTH BYTE(存储在数据块行里的字段长度)

Basic Compress不可压缩的类型(LOB压缩可以使用SecureFiles)

  • CHAR
  • CLOB
  • BLOB

 

Basic Compress的特点

  • 必须使用Direct Path Load批量加载的数据才能被压缩(所以只适用于DSS,而不适用于OLTP),或者通过alter table … move compresss 以及Table Redefinination将非压缩表迁移到压缩表
    +SQL*Laoder
    +Direct path Insert
    +并行Insert
    +CTAS
  • IOT表不支持压缩
  • 字段数量超过255个不支持压缩
  • 当表被设置为Basic Compress,表的PCTFREE参数自动设置为0,当Direct Path Load批量加载的数据无法填满一个块时,该块也不会被压缩
  • Basic Compress的表的数据块只能被压缩一次,并且无法再插入数据。因为使用Direct Path Load会将写入的块的位图信息设置为full,所以被压缩的块即使还有空间也无法以常规路径写入,而Direct Path Load只会选取HWM以上的块。
  • Basic Compress的表可以add column,但是不能设置add column default
  • Basic Compress的表不能drop column,但是可以将字段set unused

Update对Basic Compress的影响

因为当表设置为Basic Compress时,表的PCTFREE参数自动设置为0,所以当执行大量update时会产生大量的行链接,而且ORACLE并不会压缩链接块的数据,这样就会造成额外的存储空间开销和额外的性能开销,使得压缩毫无意义。

  • 如果表在业务上是只读表,那么自然不用担心
  • 如果表在业务上还存在大量的update操作,那么设置Basic Compress后可以根据需要适当调整pctfree

OLTP Compress

OLTP Compress是11gr1版本推出的压缩技术,是基于数据块级别的,对数据块内重复的行或者重复的字段值进行压缩,与Basic Compress相比的最大改进是支持常规路径的DML操作的数据也可以被压缩

OLTP Compress可压缩的类型

  • VARCHAR2
  • NUMBER
  • DATE
  • TIMESTAMP
  • RAW
  • LENGTH BYTE(存储在数据块行里的字段长度)

OLTP Compress不可压缩的类型

  • CHAR
  • CLOB
  • BLOB
  • LONG(不仅仅是LONG字段不能压缩,只要表里有LONG字段,该表就无法使用OLTP Compress)

OLTP Compress的特点

  • 支持常规路径的DML操作,当表被设置为OLTP Compress时,表的PCTFREE参数不会发生改变,并且当块里的数据达到PCTFREE上限时才会被压缩
  • 支持Direct Path Load插入,但对于Direct Path Load插入的数据必须要达到块的PCTFREE上限才会被压缩
  • OLTP Compress的表的数据块可被压缩多次,当达到pctfree上限时,块里的记录被压缩,如果还有可用空间,将可以被常规路径写入,当再次达到pctfree上限时,继续被压缩,周而复始,直到block填满为止
  • IOT表不支持压缩
  • 字段数量超过255个不支持压缩
  • OLTP Compress的表可以add column,也能设置add column default
  • OLTP Compress的表可以drop column,但是实质上也只是做了set unused操作

压缩比分析

11g之前,通常是写PL/SQL计算出压缩前的blocks和压缩后的blocks来估算压缩比,11g中ORACLE提供了DBMS_COMPRESSION包,可以较准确的评估压缩比,并且可以查出某行数据的压缩方式。

压缩比计算:

查看某行压缩方式:

 

此条目发表在Oracle, Oracle troubleshooting, Oralce performance分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注