Oracle表壓縮
從Oracle9iR2 開始,ORACLE提供了表/表空間壓縮技術,以減少磁碟開銷,節省空間,並在某些情況下提高查詢效能。
表壓縮是如何工作的在Orcle9i第2版中,表壓縮特性通過刪除在資料庫表中發現的重複資料值來節省空間。壓縮是在資料庫的資料塊級別上進行的。當確定一個表要被壓縮後,資料庫便在每一個數據庫資料塊中保留空間,以便儲存在該資料塊中的多個位置上出現的資料的單一拷貝。這一被保留的空間被稱作符號表(symbol table)。被標識為要進行壓縮的資料只儲存在該符號表中,而不是在資料庫行本身內。當在一個數據庫行中出現被標識為要壓縮的資料時,該行在該符號表中儲存一個指向相關資料的指標,而不是資料本身。節約空間是通過刪除表中資料值的冗餘拷貝而實現的。
1.表級別
1.1 建立一個壓縮表:建立表時使用COMPRESS關鍵字,COMPRESS關鍵字指示Oracle資料庫儘可能以壓縮的格式儲存該表中的行。
create table test compress as select * from dba_objects where 1=2;
create table test (id number,name varchar2(20),time date) compress;
1.2修改現有表為壓縮表:alter table test compress;
取消表的壓縮alter table test nocompress;
1.3 確定表是否被壓縮:確定一個表是否使用了壓縮,查詢user_tables,compression欄位表明表是否被壓縮
select table_name,compression from user_tables where table_name not like 'BIN%';
2.表空間級別
2.1建立表壓縮空間
create tablespace TEST datafile '/export/home/oracle/ora10g/oradata/test/test.dbf' size 10M default compress
與其他儲存引數類似,COMPRESS屬性也具有一些繼承特性。當在一個表空間中建立一個表時,它從該表空間繼承COMPRESS屬性。
2.2.使現有表空間轉換為壓縮表空間
alter tablespace test default compress;
alter tablespace test default nocompress
2.3.確定是否已經利用compress對一個表空間進行了定義,可查詢user_tablespaces資料字典檢視並檢視def_tab_compression列
select tablespace_name,def_tab_compression from user_tablespaces;
3.向一個壓縮的表中載入資料
注:當像上面那樣指定compress時,其它表中(表空間)的資料並沒有壓縮,它只是修改了資料字典的設定;只有在向一個表中加裁/插入資料時,才會壓縮資料.
只有在使用下面4種方法時,表中的資料才會被壓縮存放:
(1)直接路徑的 sql*load
(2)帶有/*+ append*/的 insert語句
(3)create table .. as select..
(4)並行insert
4.壓縮一個已經存在但並未壓縮的表
使用alter table .. move compress使一個已存在但未壓縮的錶轉換為壓縮表.
alter table tmp_test move compress;
同樣,也可以使用alter table.. move nocompress來解壓一個已經壓縮的表:
alter table tmp_test move nocompress;
5.壓縮一個物化檢視
使用用於壓縮表的類似方式來壓縮物化檢視。基於多個表的聯接生成的物化檢視通常很適於壓縮,因為它們通常擁有大量的重複資料項。
create materialized view mv_tmp_test compress as select a.phone,b.create_time from tmp_test a,recv_stat b where a.id=b.id;
可以使用ALTER MATERIALIZED VIEW命令來改變一個物化檢視的壓縮屬性。當你使用此命令時,請注意通常是在下一次重新整理該物化檢視時才會進行實際的壓縮。
alter materialized view mv_temp_test compress;
6.壓縮一個已分割槽的表
在對已分割槽的表應用壓縮時,可以有很多種選擇。你可以在表級別上應用壓縮,也可以在分割槽級別上應用壓縮。你可以利用ALTER TABLE ...MOVE PARTITION命令對此分割槽進行壓縮
alter table tmp_test move partition create_200606 compress;
要找出一個表中的哪些分割槽被壓縮了,可以查詢資料字典檢視USER_TAB_PARTITIONS;
SELECT TABLE_NAME, PARTITION_NAME,COMPRESSION FROM USER_TAB_PARTITIONS;
7.壓縮表的效能開銷
一個壓縮的表可以儲存在更少的資料塊中,從而節省了儲存空間,而使用更少的資料塊也意味著效能的提高。 在一個I/O受到一定限制的環境中對一個壓縮的表進行查詢通常可以
更快速地完成,因為他們需要閱讀的資料庫資料塊要少得多。在很少改變的表上使用壓縮技術還是可以的.表中資料經常變動的情況下,儘量不要使用表壓縮,它影響插入操作.