“資料壓縮”以前對我來說還是比較新鮮的詞,並不是沒有聽說過,而是沒有實際使用過,之前一直做專案經理工作上也設計到資料庫的營運,但由於儲存設計的比較充裕,在加上效能運轉的還能讓客戶接受,所以壓縮技術基本上沒怎麼用,當時也怕對DML操作有負面影響!之所以現在要實驗這方面的技術,也是因為二期我們的資料量暴增,對機器對效能對營運都用一定的壓力和衝擊,這也說明了這門技術是在特定環境、特定場合下來使用的,下面我們來詳細講一講如何去使用這門技術---海量資料之利器“壓縮compress”
一、應用場合
答:正如上面所說,壓縮技術一般應用在“海量資料”的範疇,在大資料量下並且重複率高的情境下應該的效果才好,適合於OLAP(報表系統)不適合OLTP(線上交易系統),當資料量小時作用還不是很大,只要資料量達到一定程度的時候使用這門技術才有意義。
二、壓縮技術的好處
1.節約空間:我認為壓縮技術的最大好處就是節約空間,在存放裝置空間很緊張的情況下更需要使用壓縮技術來緩解
2.減少memory/IO開銷:當使用了壓縮技術後,同等記錄對應的資料區塊相對較少,自然而然IO開銷就小了
3.提高資料處理效率:原本10個資料區塊的,經過壓縮後變成5個資料區塊,但還是那些資料,可效率提高了一倍。
三、壓縮原理
答:我們都用過rar壓縮zip壓縮,其實這些壓縮的原理都很相似,當然在細微處理上有不同,資料區塊壓縮原理上是使用長度較短符號來代替列中的每個值,由於符號佔用空間小於實際值,從而達到節約空間的效果,當列中重複值越多壓縮效果越好。
四、資料壓縮不適合OLTP系統
1.OLTP是一種多事務短時間片系統,有大量的DML操作,而DML操作我們都知道是有鎖lock的(insert update delete)當資料區塊中記錄數多起來時,導致訪問這個資料區塊的使用者就多,就是產生爭用和等待,從而降低了效率。
2.資料插入、更新和索引索引值更新時,都要先解壓縮再更新,等待的時間會更長。
五、分區表的壓縮
1.分區表的每個分區都可以獨立壓縮
2.有些時候,分區表在建立時不設定分區壓縮屬性,當某個分區需要壓縮時,再獨立進行壓縮
3.如果在表級設定壓縮屬性的話,那麼所有分區都會啟動壓縮功能,反正如果是某幾個分區獨立壓縮,表級屬性上什麼也不寫的。
實驗
create table leo_partition1 (object_id,object_name) 建立一個六個分區的分區表,沒有指定壓縮
partition by range (object_id)
(
partition leo_p1 values less than (1000),
partition leo_p2 values less than (2000),
partition leo_p3 values less than (3000),
partition leo_p4 values less than (4000),
partition leo_p5 values less than (5000),
partition leo_max values less than (maxvalue)
)
as select object_id,object_name from dba_objects;
LS@LEO> select count(*) from leo_partition1;
COUNT(*)
----------
10351
LS@LEO> select partition_name,compression from user_tab_partitions where table_name='LEO_PARTITION1';
PARTITION_NAME COMPRESS
------------------------------ --------
LEO_MAX DISABLED
LEO_P1 DISABLED
LEO_P2 DISABLED
LEO_P3 DISABLED
LEO_P4 DISABLED
LEO_P5 DISABLED
LS@LEO> alter table leo_partition1 compress; 例如 定義表級壓縮屬性,此時所有分區都壓縮
LS@LEO> alter table leo_partition1 modify partition leo_p1 compress; 我們測試准對leo_p1 和 leo_p5分區進行壓縮,來說明分區可以獨立壓縮
Table altered.
LS@LEO> alter table leo_partition1 modify partition leo_p5 compress;
Table altered.
LS@LEO> select partition_name,compression from user_tab_partitions where table_name='LEO_PARTITION1';
PARTITION_NAME COMPRESS
------------------------------ -----------------------
LEO_MAX DISABLED
LEO_P1 ENABLED