oracle 索引壓縮

kingsql發表於2015-05-16
  oracle 索引壓縮
    oracle 索引壓縮(key compression)是oracle 9i 中引入的一項新特性。該特性可以壓縮索引或者索引組織表中的重複鍵值,從而節省儲存空間。非分割槽的unique 索引和non-unique(至少兩列)索引都能夠被壓縮。bitmap 索引不能夠進行壓縮。
      在oracle 索引壓縮中有幾個比較糾結的術語,需要說明一下。索引壓縮是透過將索引中的鍵值拆分成兩部分實現的,也就是grouping piece 也稱作prefix 和 unique piece 也稱作suffix 。grouping piece 是用來壓縮的被unique piece 共享的部分。如果鍵值不能提供unique piece,那麼oracle 將會使用rowid 來唯一標識。只有B-tree 索引的葉子節點能夠被壓縮,分支節點不能夠被壓縮。索引壓縮是在單個block 中完成的,不能夠跨blocks進行索引壓縮。grouping piece (prefix) 和 unique piece (suffix) 儲存在同一個索引 block 中。
      具體prefix 和 suffix 是怎麼劃分的呢?預設prefix 長度等於索引列的數量減去1。當然我們可以人為控制prefix 的長度,非唯一索引的最大prefix 長度等於索引列的數量。唯一索引的最大prefix 長度等於索引列的數量減去1。比如,假設索引有三個列:
預設的時候:prefix (column1,column2) suffix (column3) 
如果有以下幾組鍵值(1,2,3),(1,2,4),(1,2,7),(1,3,5),(1,3,4),(1,4,4) 那麼在prefix中重複的(1,2),(1,3) 將會被壓縮至保留一份。
     索引壓縮適合於那些鍵值重複率高的索引,這樣才能夠達到壓縮鍵值,節省儲存空間目的。索引壓縮以後一個索引塊可以存放更多的鍵值,這樣當進行full index scan,full fast index scan 的時候IO效能會更好,但是CPU的負載會增加,至於總體的效能就要看IO效能的提高和CPU負載增加那個是主要方面了。我不認為索引壓縮效能總是提高的,更多的意義在於節省儲存空間,減少IO時間。
SQL> create table objects1 as select object_id,object_name from dba_objects;
Table created.
SQL> create table objects2 as select 100 object_id,object_name from dba_objects;
Table created.
SQL> create table objects3 as select object_id,object_name from dba_objects;
Table created.
SQL> create index objects1_idx on objects1 (object_id) compress 1;
Index created.
SQL> create index objects2_idx on objects2 (object_id) compress 1;
Index created.
SQL> create index objects3_idx on objects3 (object_id);
Index created.--建立一個不壓縮的索引。
SQL> select index_name,compression,leaf_blocks
  2  from user_indexes
  3  where index_name in ('OBJECTS1_IDX','OBJECTS2_IDX','OBJECTS3_IDX');
INDEX_NAME                     COMPRESS LEAF_BLOCKS
------------------------------ -------- -----------
OBJECTS1_IDX                   ENABLED          222
OBJECTS2_IDX                   ENABLED          112
OBJECTS3_IDX                   DISABLED         161
我們可以看到對於objects1 和 objects3 因為object_id 都是唯一的,所以沒有壓縮的空間,壓縮以後索引反而佔用了更大的空間,還不如不壓縮。而objects2 中 object_id 都是重複的壓縮效果明顯。
除了建立的時候進行索引壓縮,還可以在rebuild index 的時候指定索引壓縮和解壓縮。
SQL> alter index objects1_idx rebuild nocompress;
Index altered.
SQL> alter index objects1_idx rebuild compress;
Index altered.
注:壓縮也是會引入儲存開銷的,只是很多時候壓縮節省的空間比壓縮需要的儲存開銷更大,所以壓縮以後整體的儲存開銷減小了。
compress 後面接的數字表示的是prefix 的深度,也就是需要用來壓縮的columns 的數量。

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

相關文章