Google Search

Sunday, June 14, 2015

Table Compression in Oracle 11g


Table compression was first introduced in Oracle 9i as a space saver feature only for data warehousing projects. In oracle 11g , this is acceptable as mainstream feature which is acceptable for OLTP Databases. This will result in saving storage space as this will compress the table, increased I/O performance and reduced memory use in the buffer cache. Definitely, this incurs CPU overhead because of compression.

Compression can be done at the tablespace, table or partition level . Options/Features which are available with Compression :


  • NOCOMPRESS - The table or partition is not compressed. This is default without any compression.
  • COMPRESS – suitable for OLAP environments i.e. for data warehouse systems. Compression is enabled on the table or partition during direct-path inserts only.
  • COMPRESS FOR DIRECT_LOAD OPERATIONS – same as of simple “COMPRESS” keywords.
  • COMPRESS FOR ALL OPERATIONS –  this is the new feature which is introduced in Oracle 11g  this is suitable for OLTP systems. This option will enable compressions for all operations  (including DML operations).

        Note -> this option is renamed as COMPRESS FOR OLTP in Oracle 11gR2.

The following examples show the various compression options applied at table and partition level.

-- Table compression.
CREATE TABLE test_compress (
  id            NUMBER(10)    NOT NULL,
  desc1        VARCHAR2(50)  NOT NULL,
  created_tstp  DATE          NOT NULL
)
COMPRESS FOR ALL OPERATIONS;

-- Partition-level compression.
CREATE TABLE test_compress_par (
  id            NUMBER(10)    NOT NULL,
  desc1        VARCHAR2(50)  NOT NULL,
  created_tstp  DATE          NOT NULL
)
PARTITION BY RANGE (created_tstp) (
  PARTITION test_compress_par1 VALUES LESS THAN (TO_DATE('01/01/2013', 'DD/MM/YYYY')) COMPRESS,
  PARTITION test_compress_par2 VALUES LESS THAN (TO_DATE('01/05/2013', 'DD/MM/YYYY')) COMPRESS FOR ALL OPERATIONS,
  PARTITION test_compress_par3 VALUES LESS THAN (TO_DATE('01/09/2013', 'DD/MM/YYYY')) COMPRESS FOR DIRECT_LOAD OPERATIONS,
  PARTITION test_compress_par4 VALUES LESS THAN (MAXVALUE) NOCOMPRESS
);

Lets have a look at the setting in dba_tables:

SELECT table_name, compression, compress_for
  FROM dba_tables
 WHERE table_name IN ('TEST_COMPRESS', 'TEST_COMPRESS_PAR')

   
TABLE_NAME
COMPRESSION
COMPRESS_FOR
TEST_COMPRESS
ENABLED
OLTP
TEST_COMPRESS_PAR




Since for table “TEST_COMPRESS_PAR” compression is done at Pratition level, hence its Null in dba_objects.

Lets have a look at the details at partition level:


TABLE_NAME
COMPRESSION
COMPRESS_FOR
TEST_COMPRESS_PAR
ENABLED
BASIC
TEST_COMPRESS_PAR
ENABLED
BASIC
TEST_COMPRESS_PAR
DISABLED

TEST_COMPRESS_PAR
ENABLED
OLTP


How to Alter compression :


Compressions can be altered on the table using ALTER table command.

ALTER TABLE TEST_COMPRESS NOCOMPRESS;

ALTER TABLE test_compress_par MODIFY PARTITION test_compress_par4 COMPRESS FOR ALL OPERATIONS;

Partition compression will always override compression done at table level.


Interesting points :


Compressed tables can only have columns added or dropped if the COMPRESS FOR ALL OPERATIONS option was used.
Compression cannot applied to lob segments.
Table compression is only valid for heap organized tables.
Table compression is not applied to index organized tables.
The compression clause cannot be applied to hash or hash-list partitions. 
Table compression cannot be specified for external or clustered tables.

No comments:

Post a Comment