天天看點

oracle 索引壓縮

<b>  oracle 索引壓縮</b>

    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&gt; create table objects1 as select object_id,object_name from dba_objects;

Table created.

SQL&gt; create table objects2 as select 100 object_id,object_name from dba_objects;

SQL&gt; create table objects3 as select object_id,object_name from dba_objects;

SQL&gt; create index objects1_idx on objects1 (object_id) compress 1;

Index created.

SQL&gt; create index objects2_idx on objects2 (object_id) compress 1;

SQL&gt; create index objects3_idx on objects3 (object_id);

Index created.--建立一個不壓縮的索引。

SQL&gt; 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&gt; alter index objects1_idx rebuild nocompress;

Index altered.

SQL&gt; alter index objects1_idx rebuild compress;

注:壓縮也是會引入存儲開銷的,隻是很多時候壓縮節省的空間比壓縮需要的存儲開銷更大,是以壓縮以後整體的存儲開銷減小了。

compress 後面接的數字表示的是prefix 的深度,也就是需要用來壓縮的columns 的數量。