DB2 V9表壓縮(三)

rheet1978發表於2008-11-17
對已經存在的表使用資料行壓縮(表壓縮)

       下面我看一下如何對一個已經存在的表(表中有資料存在)啟用資料行壓縮(表壓縮),首先我們需要建立一個示例表 TEST2,並插入部分資料。接下來發出ALTER TABLE命令對示例表TEST2指定COMPRESS屬性,執行離線重組命令,給示例表TEST2建立壓縮字典並壓縮資料。

       在DB2CLP視窗中,連上示例資料庫DB2TEST1,發出CREATE TABLE命令,建立示例表TEST2,初始不使用表壓縮功能(不指定COMPRESS關鍵字),具體如清單18所示:

- - 清單18 .建立示例表TEST2

C:\> db2 connect to db2test1

   資料庫連線資訊

 資料庫伺服器         = DB2 / NT 9.1.0

 SQL 授權標識         = RHETTE

 本地資料庫別名       = DB2TEST1

C:\> DB2 CREATE TABLE TEST2 ( ID INTEGER , NAME VARCHAR ( 10 ) , DEPARID VARCHAR ( 10 ) , NOTE VARCHAR ( 100 ) ) IN TABLESPACE1

DB20000I  SQL命令成功完成。

 

       命令執行成功,這樣我們就建立了示例表TEST2,其不使用表壓縮功能,接下來我們對示例表TEST2插入資料,部門編號都是‘001’,備註資訊都是‘TEST’,編號和姓名都不相同,具體如清單19所示:

- - 清單19 .對示例表TEST2插入部分資料

C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 1 , ' AA ' , '  001 '  , '  TEST ')

DB20000I  SQL命令成功完成。

C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 2 , ' BB ' , '  001 '  , '  TEST ')

DB20000I  SQL命令成功完成。

C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 3 , ' CC ' , '  001 '  , '  TEST ')

DB20000I  SQL命令成功完成。

C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 4 , ' DD ' , '  001 '  , '  TEST ')

DB20000I  SQL命令成功完成。

C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 5 , ' EE ' , '  001 '  , '  TEST ')

DB20000I  SQL命令成功完成。

C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 6 , ' FF ' , '  001 '  , '  TEST ')

DB20000I  SQL命令成功完成。

C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 7 , ' GG ' , '  001 '  , '  TEST ')

DB20000I  SQL命令成功完成。

C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 8 , ' HH ' , '  001 '  , '  TEST ')

DB20000I  SQL命令成功完成。

C:\> DB2 INSERT INTO TEST2( ID , NAME , DEPARID , NOTE ) VALUES ( 9 , ' II ' , '  001 '  , '  TEST ')

DB20000I  SQL命令成功完成。

 

命令成功完成,這樣我們為示例表TEST2插入了9條記錄。部門編號都是‘001’,備註資訊都是‘TEST’,編號和姓名都不相同。

如果想對示例表TEST2啟用表壓縮功能,需要把表的COMPRESS選項改成YES。下面我們在DB2CLP視窗中,發出ALTER TABLE命令,把示例表TEST2的COMPRESS屬性設定為YES,具體如清單20所示:

- - 清單20 .對示例表TEST2啟用COMPRESS屬性

C:\> db2 alter table test2 compress yes

DB20000I  SQL命令成功完成。

 

       命令成功完成,此時示例表TEST2啟用了表壓縮功能,但是由於沒有壓縮字典的存在,所以示例表TEST2中的資料還不是以壓縮的方式儲存的。直到顯式的發出了離線REORG命令,建立了壓縮字典後,示例表TEST2中的資料才會真正的壓縮儲存。

下面我們對示例表TEST2建立一個壓縮字典,由於是第一次構建壓縮字典,所以需要執行帶RESETDICTIONARY選項的REORG命令。

在DB2CLP視窗中,對示例表TEST2發出REORG命令,執行離線重組,為示例表TEST2構建壓縮字典,具體如清單21所示:

- - 清單21 .對示例表TEST2建立壓縮字典

 

C:\> db2 REORG TABLE test2  resetdictionary

DB20000I  REORG命令成功完成。

 

命令成功完成,這個命令將掃描整個表,建立壓縮字典,然後執行實際表的重組,並在重組的過程中壓縮資料。由於部門編號和備註資訊各行的資料都相同,所以將DB2通過分析與獲取資料中出現的重複模式,生成壓縮字典。

如果想檢視對示例表TEST2使用表壓縮(資料行壓縮)比不使用表壓縮節省了多少空間,可以通過INSPECT ROWCOMPESTIMATE語句進行評估分析,也可以檢視系統表SYSIBM.SYSTABLES檢視實際的壓縮效果,具體如前面所述。

下面我們來總結一下表壓縮的相關內容。

如果想對一個新表啟用表壓縮,可以按照以下步驟:

Ø         建立一個表,將表的COMPRESS屬性設定為 YES

Ø         對錶裝入一部分資料

Ø         執行帶有RESETDICTIONARY選項的離線重組,建立一個新的壓縮字典

Ø         裝入剩餘的資料到這個表中(裝入時將考慮壓縮字典並在裝入時壓縮資料)

如果想對一個已經存在的表(表中已經有資料)啟用表壓縮,可以按照以下步驟:

Ø         通過ALTER TABLE命令將表的COMPRESS屬性設定為 YES

Ø         執行帶有RESETDICTIONARY選項的離線重組,建立一個新的壓縮字典

如果想檢視對錶使用表壓縮(資料行壓縮)比不使用表壓縮節省了多少空間,可以通過INSPECT ROWCOMPESTIMATE語句進行評估分析。帶壓縮估計選項(ROWCOMPESTIMATE)的INSPECT命令,將生成一份報告,描述節省了多少頁。語法如下:

DB2 INSPECT ROWCOMPESTIMATE TABLE NAME table_name RESULTS KEEP file_name

 由於INSPECT命令生成的檔案是二進位制的,無法直接檢視,所以我們需要使用DB2INSPF命令將此檔案格式轉成可讀模式才能檢視,具體語法如下:

DB2INSPF file_name  output_file_name

 

資料行壓縮是基於字典的壓縮,每個字典是一個壓縮/解壓縮資料記錄的符號表。演算法是基於LEMPEL-ZIV(LZ)演算法,使用靜態字典,每張表一個字典,存放在永久表物件中。使用資料行壓縮的資料無論是在磁碟還是在記憶體都是壓縮的,只有在計算前才會被解壓縮,因此極大地節約了I/O頻寬和記憶體,但是增加了CPU消耗。對於壓縮的資料行其日誌也是壓縮的。對於經壓縮後不能節省儲存的行,DB2不對其進行壓縮處理,資料(每一行)中重複的串是高壓縮比的關鍵。文字資料一般壓縮得比較好,因為其中往往包括重複字串以及大量的重複字元、前導或字尾空格。

需要注意的是,通過執行CREATE TABLE或ALTER TABLE語句開啟表壓縮開關時,並不壓縮資料,資料僅在建立壓縮字典表後才能真正實現壓縮。壓縮字典表將在臨時記憶體中建立,大約需臨時佔用10M左右記憶體,臨時記憶體從UTILITIES HEAP中申請。字典的分析與生成基於表中已有的資料,是離線進行的,在以後的版本中將會支援線上進行,也就是說現在只能是在離線重組時建立壓縮字典,在將來的版本中將支援聯機重組時建立壓縮字典。

需要注意的是,執行離線重組(REORG)的時候,有兩個重要的選項,分別是RESETDICTIONARY和KEEPDICTIONARY,兩個含義和動作都是不一樣的。我們來分別來看一下:

當使用RESETDICTIONARY選項的REORG時

 COMPRESS屬性   壓縮字典是否存在   結果
 YES   YES   建立新的字典表; 並重新壓縮全部資料
 YES   NO   建立新的字典表; 並壓縮資料
 NO   YES   刪除已有字典表,並將全部壓縮資料解壓縮
 NO   NO   不做任何操作

當使用KEEPDICTIONARY選項的REORG時

 COMPRESS屬性   壓縮字典是否存在  結果
 YES   YES   保留已有字典表; 壓縮新增/變化資料
 YES   NO   建立新的字典表; 並壓縮資料
 NO   YES   保留已有字典表,但將全部壓縮資料解壓縮
 NO   NO   不做任何操作

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

相關文章