oracle 壓縮技術(compress)

hurp_oracle發表於2014-09-04

Oracle壓縮資料的處理基於塊,其本質上是透過消除在資料庫塊中的重複資料來實現空間節約,具體方法如下:比較資料塊中包含的所有欄位或記錄,其中重複的資料只在位於資料塊開始部分的記號表(Symbol Table)中儲存一份,在其他行或欄位出現同樣的資料時,只記錄一個指向記號表中相關資料的指標。
oracle 提供的壓縮方式及特性
oracle 提高了4總壓縮方式,分別適用不同的場景。分別是:
basic compression:壓縮度高,CPU開銷最低,適用於DDS。
OLTP compression : 壓縮度高,CPU開銷最低,適用於OLTP,DDS。
  
注:壓縮可以指定在表空間級,表級,分割槽級。如果表空間帶有壓縮屬性那麼其中的表預設也帶有壓縮屬性,但是表級的壓縮屬性可以覆蓋表空間級的壓縮屬性,表的壓縮屬性與分割槽的壓縮屬性的關係也是這樣的。以下主要講的是表的壓縮。

另外有兩種壓縮方式,不過這兩種壓縮方式使用範圍有限:

SQL> create table object_copy compress for query

  2  as select * from dba_objects;

as select * from dba_objects

                 *

ERROR at line 2:

ORA-64307: hybrid columnar compression is only supported in tablespaces

residing on Exadata storage

建立表的時候透過指定compress basic 關鍵字使表使用basic compression的壓縮方式。如果只使用compress 關鍵字不指定壓縮方式,預設是basic方式。使用basic 方式壓縮的特性在於:使用直接路徑insert 的記錄是壓縮的,update 操作相當於解壓縮。

SQL> create table objects_1

  2  compress basic

  3  as select object_id,object_name

  4  from dba_objects;

Table created.

SQL> create table objects_1

  2  compress basic

  3  as select object_id,object_name

  4  from dba_objects;

Table created.

指定OLTP方式的壓縮方法指定關鍵字:compress for oltp。OLTP方式的壓縮方式特性

在於:使用直接路徑insert 的記錄依然是壓縮的,傳統的insert 語句插入的記錄也是壓縮的,update 語句操作過後資料依然是壓縮的。

建立壓縮表:

create table Name(

......

) compress;

alter table Name compress;

alter table Name nocompress;

物化檢視的壓縮:

create materialized view ViewName compress

as select ......;

alter materialized view ViewName compress;

 

分割槽表的壓縮:

create table Name (

......

) compress

partition by ......;

create table Name (

......

)

partition by ......(

partition PartName ...... compress,

partition PartName ...... compress,

partition PartName ......

);

在表空間級別上定義壓縮屬性:

create tablespace ...... default compress;

alter tablespace ...... compress / nocompress;

當壓縮屬性被定義在表空間上時,在其中建立表時,該特性將被表繼承,但表級別的壓縮屬性會覆蓋表空間的壓縮屬性。

 

檢視一個表是否為壓縮表:

select compression from user_table where table_name=TableName;

 

檢視一個表空間是否被壓縮:

select def_tab_compression from dba_tablespace where tablespace_name=TablespaceName;

 

檢視分割槽表各分割槽的壓縮屬性:

select table_name, partition_name, compression from user_tab_partitions where table_name=TableName;

 

表壓縮的實現:

壓縮表的資料要能夠被壓縮,必須正確地使用批次裝載或插入:

1、在SQL * LOADER中使用直接路徑(direct path)裝載資料;

2、執行create table ... as select語句;

3、執行並行插入語句;

4、執行序列插入語句並且使用append提示。

alter table Name move compress / nocompress;

 

效能分析:

1、在批次裝載或插入資料的過程中,由於壓縮的同時進行,會引起CPU使用率提高,及導致裝載時間明顯增加。

2、對於普通的INSERT語句,由於沒有執行壓縮過程,效能幾乎沒有影響。

3、用DELETE語句刪除壓縮表的操作會比較快,主要是因為壓縮表中被壓縮行的資料比較小,相應的需要寫日誌的資料量也比較小。

4、更新壓縮的操作會比較慢,主要由於ORACLE對非壓縮表執行了一些最佳化。

5、在IO吞吐率受限制的執行大批次查詢,比如全表掃描,壓縮表將明顯提高查詢速度,主要由於壓縮後,查詢同樣的資料行只需要讀取更少的資料塊。

常用壓縮語句:
----對分割槽進行壓縮
alter table ICDCUST2.AM_SCORE_BALANCE move partition P_532_201408 PARALLEL(DEGREE 12) compress nologging;
----檢視壓縮情況
SQL> select table_name,compression,compress_for from dba_tables where table_name LIKE '%TEST%' AND OWNER='SHSNC';
TABLE_NAME                     COMPRESS COMPRESS_FOR
------------------------------ -------- ------------
TEST                           ENABLED  BASIC
TEST005                        ENABLED  BASIC
TEST01                         ENABLED  BASIC
TEST02                         ENABLED  OLTP
TEST03                         DISABLED
-----建立如下的分割槽表,每個分割槽可以指定不同的壓縮方式。
create table shsnc.test(
object_id number(10),
object_name varchar2(120)
)
partition by range(object_id)(
partition p1 values less than (100000) compress basic,
partition p2 values less than (200000) compress for oltp,
partition p3 values less than (maxvalue) nocompress
)




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29446986/viewspace-1264212/,如需轉載,請註明出處,否則將追究法律責任。

相關文章