表壓縮是如何工作的
在Orcle9i第2版中,表壓縮特性通過刪除在資料庫表中發現的重複資料值來節省空間的。壓縮是在資料庫的資料區塊層級上進行的。當確定一個表要被壓縮後,資料庫便在每一個資料庫資料區塊中保留空間,以便儲存在該資料區塊中的多個位置上出現的資料的單一拷貝。這一被保留的空間被稱作符號表(symbol table)。被標識為要進行壓縮的資料只儲存在該符號表中,而不是在資料庫行本身內。當在一個資料庫行中出現被標識為要壓縮的資料時,該行在該符號表中儲存一個指向相關資料的指標,而不是資料本身。節約空間是通過刪除表中資料值的冗餘拷貝而實現的。
對於使用者或應用程式開發人員來說,表壓縮的效果是透明的。無論表是否被壓縮,開發人員訪問表的方式都是相同的,所以當你決定壓縮一個表時,不需要修改SQL查詢。表壓縮的設定通常由資料庫管理員或設計人員進行配置,幾乎不需要開發人員或使用者參與。
1.表層級:
1.1 建立一個壓縮表:
建立表時使用COMPRESS關鍵字,COMPRESS關鍵字指示Oracle資料庫儘可能以壓縮的格式儲存該表中的行。
SQL> create table tmp_test
(id number,phone varchar2(20),create_time date)
compress;
1.2 修改現有表為壓縮表:
SQL> alter table tmp_test compress;
取消表的壓縮:
SQL> alter table tmp_test nocompress;
1.3 確定表是否被壓縮:
確定一個表是否使用了壓縮,查詢user_tables,compression欄位表明表是否被壓縮.
SQL> select table_name,compression from user_tables where table_name not like 'BIN%';
TABLE_NAME COMPRESS
------------------------------ --------
CLASSES ENABLED
ROOMS ENABLED
STUDENTS DISABLED
MAJOR_STATS DISABLED
2.資料表空間層級:
2.1 建立表壓縮空間:
可以在資料表空間層級上定義COMPRESS屬性,既可以在產生時利用CREATE TABLESPACE來定義,也可以稍後時間利用ALTER TABLESPACE來定義。
與其他儲存參數類似,COMPRESS屬性也具有一些繼承特性。當在一個資料表空間中建立一個表時,它從該資料表空間繼承COMPRESS屬性。
可以在一個資料表空間直接壓縮或解壓縮一個表,而不用考慮資料表空間層級上的COMPRESS屬性。
2.2 使現有資料表空間轉換為壓縮資料表空間 SQL> alter tablespace sms default compress;
SQL> alter tablespace sms default nocompress;
2.3 確定是否已經利用COMPRESS對一個資料表空間進行了定義,可查詢USER_TABLESPACES資料字典視圖並查看DEF_TAB_COMPRESSION列
SQL> select tablespace_name,def_tab_compression from user_tablespaces;
TABLESPACE DEF_TAB_
---------- --------
USERS DISABLED
TEST DISABLED
UNDOTBS01 DISABLED
STATPACK DISABLED
3.向一個壓縮的表中載入資料
注:當像上面那樣指定compress時,其它表中(資料表空間)的資料並沒有壓縮,它只是修改了資料字典的設定;只有在向一個表中加裁/插入資料時,才會壓縮資料.
只有在使用下面4種方法時,表中的資料才會被壓縮存放:
直接路徑的 sql*load
帶有/*+ append*/的 insert語句
create table .. as select..
· 並行insert
4.壓縮一個已經存在但並未壓縮的表
使用alter table .. move compress使一個已存在但未壓縮的錶轉換為壓縮表.
SQL> alter table tmp_test move compress;
同樣,也可以使用alter table.. move nocompress來解壓一個已經壓縮的表:
SQL> alter table tmp_test move nocompress;
5.壓縮一個物化視圖
使用用於壓縮表的類似方式來壓縮物化視圖。
基於多個表的聯結產生的物化視圖通常很適於壓縮,因為它們通常擁有大量的重複資料項目。
SQL> 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命令來改變一個物化視圖的壓縮屬性。
當你使用此命令時,請注意通常是在下一次重新整理該物化視圖時才會進行實際的壓縮。
SQL> alter materialized view mv_temp_test compress;
6.壓縮一個已分區的表
在對已分區的表應用壓縮時,可以有很多種選擇。你可以在表層級上應用壓縮,也可以在分區層級上應用壓縮。
你可以利用ALTER TABLE ...MOVE PARTITION命令對此分區進行壓縮
SQL> alter table tmp_test move partition create_200606 compress;
要找出一個表中的哪些分區被壓縮了,可以查詢資料字典視圖USER_TAB_PARTITIONS
SQL>SELECT TABLE_NAME, PARTITION_NAME,COMPRESSION FROM USER_TAB_PARTITIONS;
7.壓縮表的效能開銷
一個壓縮的表可以儲存在更少的資料區塊中,從而節省了儲存空間,而使用更少的資料區塊也意味著效能的提高。 在一個I/O受到一定限制的環境中對一個壓縮的表進行查詢通常可以更快速地完成,因為他們需要閱讀的資料庫資料區塊要少得多。
使用sql*load載入100萬資料:
表名
行數
路徑
是否是壓縮的
消耗的時間
test_nocom
1000000
直接
非壓縮的
00:00:21.12
test_comp
1000000
直接
壓縮的
00:00:47.77
由此可以看出,向壓縮表中加入資料的時間是正常表的一倍.載入壓縮的表所需要的額外時間來自於在資料載入過程中所執行的壓縮操作。
可以得出的結論是:在很少改變的表上使用壓縮技術還是可以的.表中資料經常變動的情況下,盡量不要使用表壓縮,它影響插入操作.