書名: DB2 V9權(quán)威指南作者名: 程永 王雪梅 石巖松 姜學(xué)軍本章字?jǐn)?shù): 10851字更新時間: 2019-01-01 06:20:16
2.3 DB2 V9.1表壓縮
2.3.1 簡介
在V9之前,DB2有三種方式的壓縮,分別是空間值壓縮(VALUE COMPRESS子句)、索引壓縮(MDC技術(shù))和數(shù)據(jù)庫備份壓縮。
使用空間值壓縮(VALUE COMPRESSION子句)時,不會將變長數(shù)據(jù)類型(VARCHAR、VARGRAPHICS、LONG VARCHAR、LONG VARGRAPHIC、BLOB、CLOB和DBCLOB)的空值(NULL)和零長度數(shù)據(jù)存儲在磁盤上。只有與這些數(shù)據(jù)類型相關(guān)聯(lián)的開銷值才會占用磁盤空間。如果使用了VALUE COMPRESS子句,那么還可以使用可選COMPRESS SYSTEM DEFAULT選項(xiàng)來進(jìn)一步減少磁盤空間的使用量。如果插入或更新的值等于列的數(shù)據(jù)類型的系統(tǒng)默認(rèn)值,那么使用的磁盤空間最少。默認(rèn)值將不會存儲在磁盤上。支持COMPRESS SYSTEM DEFAULT的數(shù)據(jù)類型包括所有數(shù)字類型列、定長字符和定長圖形字符串?dāng)?shù)據(jù)類型。這表示零和空格可以壓縮。
通過在創(chuàng)建表的時候指定ORGANIZE BY DIMENSIONS選項(xiàng),將對表啟用MDC功能,可以指定一個或多個鍵作緯。MDC是使用基于塊的索引,塊索引指向記錄塊或記錄組,而不是指向單條記錄。通過從物理上根據(jù)群集值將MDC表中的數(shù)據(jù)組織成塊,然后使用塊索引來存取這些塊,能顯著地改善性能。在MDC中,群集索引是基于塊的。這些索引比常規(guī)的基于記錄的索引要小很多,因此,占用的磁盤空間更少,并且掃描時速度會更快。
如果數(shù)據(jù)庫中的數(shù)據(jù)量比較大,可以在備份數(shù)據(jù)庫的時候通過指定COMPRESS選項(xiàng)使用備份壓縮功能,從而使備份映像文件所需要的存儲空間最小。
行壓縮功能在壓縮數(shù)據(jù)時,通過使用較少的數(shù)據(jù)庫頁來表示相同數(shù)據(jù),從而達(dá)到節(jié)省磁盤存儲空間的目的。尤其是對于那些行中包含重復(fù)模式的大型表,將能很大地改善查詢性能。數(shù)據(jù)行壓縮(COMPRESS子句)可與現(xiàn)有的空間值壓縮(VALUE COMPRESS子句)一起使用。對于使用行壓縮的表,查詢性能可能有所提高,可能需要更少的I/O操作來訪問壓縮數(shù)據(jù),并且在壓縮后可以將更多數(shù)據(jù)高速緩存在緩沖池中。由于用戶數(shù)據(jù)壓縮在日志記錄內(nèi),因此日志記錄可能會變小。對于UPDATE日志記錄,則可能不會出現(xiàn)這種情況。與行壓縮關(guān)聯(lián)的成本取決于壓縮和解壓縮數(shù)據(jù)所需的額外CPU周期。在訪問行中的數(shù)據(jù)時,壓縮和解壓縮是以行為單位執(zhí)行的。要評估使用行壓縮后存儲器的節(jié)省情況,可使用DB2 INSPECT聯(lián)機(jī)實(shí)用程序的ROWCOMPESTIMATE選項(xiàng)。在啟用了表的COMPRESS屬性并創(chuàng)建了壓縮字典之后才可壓縮行。可通過CREATE或ALTER TABLE語句來設(shè)置COMPRESS屬性。可使用REORG TABLE命令來創(chuàng)建壓縮字典。在處理REORG命令時,現(xiàn)有的所有表行都要被壓縮。數(shù)據(jù)行壓縮不適用于索引、LOB、LF或XML對象。
在將表存儲在磁盤上時,如果對數(shù)據(jù)行、空值和系統(tǒng)默認(rèn)值使用諸如壓縮之類的功能,則表可能占用較少的空間。通過數(shù)據(jù)壓縮,可以使用較少的數(shù)據(jù)庫頁來存儲數(shù)據(jù),從而節(jié)省磁盤存儲空間。由于每頁可以存儲更多的邏輯數(shù)據(jù),因此訪問同樣多的邏輯數(shù)據(jù)時需要讀取的頁數(shù)將會少一些。這意味著壓縮還可以節(jié)省磁盤I/O,I/O速度也會加快,因?yàn)榭梢詫⒏嗟倪壿嫈?shù)據(jù)高速緩存在緩沖池中。
由于數(shù)據(jù)行壓縮是DB2 V9新增的功能,很多用戶對其特性不是很了解,本節(jié)將重點(diǎn)介紹DB2 V9數(shù)據(jù)行壓縮功能,并通過實(shí)際的例子來幫助用戶理解和提高。
將按照下列順序介紹表壓縮。
1.創(chuàng)建示例數(shù)據(jù)庫DB2TEST1:將一步步講解如何創(chuàng)建示例數(shù)據(jù)庫DB2TEST1,并創(chuàng)建示例表空間TABLESPACE1。
2.對新表使用數(shù)據(jù)行壓縮(表壓縮):
創(chuàng)建使用表壓縮功能的示例表TEST1,并插入多條記錄;通過運(yùn)行脫機(jī)重組創(chuàng)建壓縮字典后,再插入剩余記錄;
通過INSPECT ROWCOMPESTIMATE語句進(jìn)行估計壓縮的效果,這個只是估計,和實(shí)際的壓縮可能會有出入;
查詢系統(tǒng)表SYSIBM.SYSTABLES,檢查實(shí)際的壓縮效果;
取消示例表TEST1的壓縮屬性,運(yùn)行脫機(jī)重組,對示例表TEST1進(jìn)行解壓縮。
3.對已經(jīng)存在的表使用數(shù)據(jù)行壓縮(表壓縮):
創(chuàng)建不使用表壓縮功能的示例表TEST2,插入數(shù)據(jù);
發(fā)出ALTER TABLE命令對示例表TEST2指定COMPRESS屬性,運(yùn)行脫機(jī)重組命令,給示例表TEST2創(chuàng)建壓縮字典并壓縮數(shù)據(jù);
表壓縮總結(jié):總結(jié)第2步和第3步中用到的命令,以及表的壓縮屬性和壓縮字典在各種情況下表是否進(jìn)行壓縮。
4.對表啟用空值、系統(tǒng)默認(rèn)值壓縮:
創(chuàng)建示例表TEST3,使用空值壓縮和系統(tǒng)默認(rèn)值壓縮,插入數(shù)據(jù);
對示例表TEST3取消使用空值壓縮和系統(tǒng)默認(rèn)值壓縮。
2.3.2 創(chuàng)建示例數(shù)據(jù)庫DB2TEST1
首先在Windows XP環(huán)境下安裝DB2 ESE V9.1,安裝完成后,打開一個DB2CLP窗口,發(fā)出CREATE DATABASE語句,創(chuàng)建示例數(shù)據(jù)庫DB2TEST1,具體如清單2-44所示。
清單2-44 創(chuàng)建示例數(shù)據(jù)庫DB2TEST1
C:\> DB2 CREATE DATABASE DB2TEST1 DB20000I CREATE DATABASE命令成功完成。
命令執(zhí)行成功,這樣創(chuàng)建了一個示例數(shù)據(jù)庫DB2TEST1。
下面繼續(xù)在DB2CLP窗口中,連上示例數(shù)據(jù)庫DB2TEST1,發(fā)出GETDB CFG命令,查看示例數(shù)據(jù)庫的配置參數(shù),在返回結(jié)果中可以看到,數(shù)據(jù)庫代碼頁是1386,數(shù)據(jù)庫地域是CN,數(shù)據(jù)庫代碼集是GBK,部分結(jié)果如清單2-45所示。
清單2-45 查看示例數(shù)據(jù)庫DB2TEST1配置參數(shù)
C:\> db2 connect to db2test1 數(shù)據(jù)庫連接信息 數(shù)據(jù)庫服務(wù)器 =DB2 / NT 9.1.0 SQL授權(quán)標(biāo)識 =RHETTE 本地數(shù)據(jù)庫別名 =DB2TEST1 C:\> db2 get db cfg for db2test1 數(shù)據(jù)庫db2test1 的數(shù)據(jù)庫配置 數(shù)據(jù)庫配置發(fā)行版級別 =0x0b00 數(shù)據(jù)庫發(fā)行版級別 =0x0b00 數(shù)據(jù)庫地域 =CN 數(shù)據(jù)庫代碼頁 =1386 數(shù)據(jù)庫代碼集 =GBK 數(shù)據(jù)庫國家/地區(qū)代碼 =86 數(shù)據(jù)庫整理順序 =UNIQUE 備用整理順序 ( ALT_COLLATE )= 數(shù)據(jù)庫頁大小 =4096 . . . . . . . . . . . . . . . . . .
下面在示例數(shù)據(jù)庫DB2TEST1中創(chuàng)建1個4K頁大小的DMS表空間,用來存放示例表的數(shù)據(jù),名稱為TABLESPACE1。
在DB2CLP窗口中,發(fā)出CREATE TABLESPACE命令,創(chuàng)建4K頁大小的示例表空間TABLESPACE1,對應(yīng)的緩沖池使用默認(rèn)創(chuàng)建的IBMDEFAULTBP,具體如清單2-46所示。
清單2-46 創(chuàng)建DMS示例表空間
C:\> DB2 CREATE REGULAR TABLESPACE TABLESPACE1 PAGESIZE 4K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL IBMDEFAULTBP DB20000I SQL命令成功完成。
命令成功完成。注意,在MANAGED BY后面跟的是AUTOMATIC STORAGE,表示新創(chuàng)建的表空間將使用自動存儲。如果新建的表空間使用DB2管理存儲器(自動存儲器),根據(jù)要創(chuàng)建的表空間類型不同,其空間管理會有所區(qū)別,當(dāng)其表空間類型是常規(guī)或者大型時,將自動創(chuàng)建成數(shù)據(jù)庫管理空間(DMS),當(dāng)其表空間類型是系統(tǒng)臨時或者用戶臨時表空間時,將自動創(chuàng)建成系統(tǒng)管理空間(SMS)。使用自動存儲就不再需要擔(dān)心如何添加容器以及監(jiān)控容器的增長等,自動存儲會自動增加表空間在磁盤和文件系統(tǒng)上的大小。在DB2CLP窗口中輸入LIST TABLESPACE命令,可以看到示例表空間TABLESPACE1已經(jīng)創(chuàng)建成功,表空間標(biāo)識是3,其空間管理類型是數(shù)據(jù)庫管理空間。另外,數(shù)據(jù)庫默認(rèn)創(chuàng)建的3個表空間也在結(jié)果集中,分別是SYSCATSPACE、TEMPSPACE1和USERSPACE1,具體如清單2-47所示。
清單2-47 查看示例表空間
C:\> db2 list tablespaces show detail 當(dāng)前數(shù)據(jù)庫的表空間 表空間標(biāo)識 =0 名稱 =SYSCATSPACE 類型 =數(shù)據(jù)庫管理空間 內(nèi)容 =所有持久數(shù)據(jù)。常規(guī)表空間。 狀態(tài) =0x0000 詳細(xì)解釋: 正常 總計頁數(shù) =8192 可用頁數(shù) =8188 已用頁數(shù) =7924 可用頁數(shù) =264 高水位標(biāo)記(頁) =7924 頁大?。ㄒ宰止?jié)計) =4096 擴(kuò)展數(shù)據(jù)塊大小(頁) =4 預(yù)取大小(頁) =4 容器數(shù) =1 表空間標(biāo)識 =1 名稱 =TEMPSPACE1 類型 =系統(tǒng)管理空間 內(nèi)容 =系統(tǒng)臨時數(shù)據(jù) 狀態(tài) =0x0000 詳細(xì)解釋: 正常 總計頁數(shù) =1 可用頁數(shù) =1 已用頁數(shù) =1 可用頁數(shù) =不適用 高水位標(biāo)記(頁) =不適用 頁大?。ㄒ宰止?jié)計) =4096 擴(kuò)展數(shù)據(jù)塊大小(頁) =32 預(yù)取大?。摚? =32 容器數(shù) =1 表空間標(biāo)識 =2 名稱 =USERSPACE1 類型 =數(shù)據(jù)庫管理空間 內(nèi)容 =所有持久數(shù)據(jù)。大型表空間。 狀態(tài) =0x0000 詳細(xì)解釋: 正常 總計頁數(shù) =8192 可用頁數(shù) =8160 已用頁數(shù) =96 可用頁數(shù) =8064 高水位標(biāo)記(頁) =96 頁大?。ㄒ宰止?jié)計) =4096 擴(kuò)展數(shù)據(jù)塊大?。摚? =32 預(yù)取大?。摚? =32 容器數(shù) =1 表空間標(biāo)識 =3 名稱 =TABLESPACE1 類型 =數(shù)據(jù)庫管理空間 內(nèi)容 =所有持久數(shù)據(jù)。常規(guī)表空間。 狀態(tài) =0x0000 詳細(xì)解釋: 正常 總計頁數(shù) =8192 可用頁數(shù) =8160 已用頁數(shù) =96 可用頁數(shù) =8064 高水位標(biāo)記(頁) =96 頁大?。ㄒ宰止?jié)計) =4096 擴(kuò)展數(shù)據(jù)塊大?。摚? =32 預(yù)取大?。摚? =32 容器數(shù) =1
2.3.3 對新表使用數(shù)據(jù)行壓縮(表壓縮)
數(shù)據(jù)行壓縮的目標(biāo)是節(jié)省磁盤存儲空間,它還可以減少磁盤I/O。另外,可以在緩沖池中高速緩存更多數(shù)據(jù),這樣就可以提高緩沖池命中率。但是,關(guān)聯(lián)的成本以壓縮和解壓縮數(shù)據(jù)所需的額外CPU周期的形式出現(xiàn)。數(shù)據(jù)行壓縮節(jié)省的存儲量和對性能的影響與數(shù)據(jù)庫中數(shù)據(jù)的特征、數(shù)據(jù)庫的布局和調(diào)整以及應(yīng)用程序工作負(fù)載相關(guān)。數(shù)據(jù)行壓縮僅壓縮數(shù)據(jù)頁上的數(shù)據(jù)或日志記錄中的數(shù)據(jù)。數(shù)據(jù)行壓縮使用基于靜態(tài)字典的壓縮算法來逐行壓縮數(shù)據(jù)。在行級別壓縮數(shù)據(jù)允許將一行中跨多個列值的重復(fù)模式替換為較短的符號字符串。為了壓縮表數(shù)據(jù),表COMPRESS屬性必須設(shè)置為YES,且該表必須有壓縮字典。要把表設(shè)置成壓縮方式,使用下列兩個命令之一。
CREATE TABLE table_name . . . COMPRESS YES OR ALTER TABLE tablename COMPRESS YES
接下來創(chuàng)建示例表TEST1,表數(shù)據(jù)將存儲在表空間TABLESPACE1中,示例表TEST1將啟用表壓縮功能(數(shù)據(jù)行壓縮)。在DB2CLP窗口中,連上示例數(shù)據(jù)庫DB2TEST1,發(fā)出CREATE TABLE命令,創(chuàng)建帶COMPRESS屬性的示例表TEST1,具體如清單2-48所示。
清單2-48 創(chuàng)建帶COMPRESS屬性的示例表TEST1
C:\> DB2 CREATE TABLE TEST1 ( ID INTEGER , NAME VARCHAR ( 10 ) , DEPARID VARCHAR ( 10 ) , NOTE VARCHAR ( 100 ) ) IN TABLESPACE1 COMPRESS YES DB20000I SQL命令成功完成。
命令執(zhí)行成功。這樣就創(chuàng)建了示例表TEST1,示例表TEST1啟用了數(shù)據(jù)行壓縮方式。要使壓縮生效,需要構(gòu)建壓縮字典并接著壓縮表(表中需要有數(shù)據(jù),不能是空表),然后DB2將掃描表中的數(shù)據(jù),找出相同的字符串替換為較短的符號字符串,并放入到壓縮字典中。表中的所有數(shù)據(jù)行都將參與構(gòu)建壓縮字典。該字典將與表數(shù)據(jù)行一起存儲在表數(shù)據(jù)對象部分。為了構(gòu)建壓縮字典,可以使用REORG命令,執(zhí)行脫機(jī)重組。第一次壓縮一個表(或者需要重新構(gòu)建壓縮字典)可以使用如下命令:
REORG table table_name resetdictionary
這個命令將掃描整個表,創(chuàng)建壓縮字典,然后執(zhí)行實(shí)際表的重組,并在重組的過程中壓縮數(shù)據(jù)。需要注意此時REORG使用的是RESETDICTIONARY選項(xiàng)。如果表的COMPRESS屬性為YES并且字典存在,則可能會壓縮插入到頁中的數(shù)據(jù)行。此情況適用于任何插入行操作,包括通過導(dǎo)入或裝入操作來插入。壓縮是對整個表啟用的,但卻是單獨(dú)地壓縮每一行數(shù)據(jù)。因此,一個表可以同時包含已壓縮的行和未壓縮的行。以后如果需要運(yùn)行一個正常的表重組,但是有不希望重新構(gòu)建壓縮字典,可以運(yùn)行下面的命令:
REORG table table_name keepdictionary
需要注意,此時REORG使用的是KEEPDICTIONARY選項(xiàng)。每個表都擁有自己的壓縮字典。只能壓縮永久數(shù)據(jù)對象。數(shù)據(jù)行壓縮不適用于索引、長整型數(shù)據(jù)對象、LOB數(shù)據(jù)對象和XML數(shù)據(jù)對象。行壓縮與表數(shù)據(jù)復(fù)制支持不兼容。
下面將為清單2-48中創(chuàng)建的示例表TEST1創(chuàng)建一個壓縮字典。
在DB2CLP窗口中,發(fā)出REORG命令,脫機(jī)執(zhí)行表重組命令。當(dāng)示例表TEST1是空表時,執(zhí)行REORG命令時會報SQL2220W錯誤,構(gòu)建壓縮字典失敗,這是因?yàn)槭纠鞹EST1中需要有部分?jǐn)?shù)據(jù)時創(chuàng)建壓縮字典才會成功,否則壓縮字典將無法構(gòu)建。具體如清單2-49所示。
清單2-49 對示例表TEST1創(chuàng)建壓縮字典
C:\> db2 R度的任何記錄。未構(gòu)建新EORG TABLE test1 resetdictionary SQL2220W沒有為一個或多個數(shù)據(jù)對象構(gòu)建壓縮字典。 C:\> db2 ? sql2220w SQL2220W沒有為一個或多個數(shù)據(jù)對象構(gòu)建壓縮字典。 解釋: 未能為一個或多個數(shù)據(jù)對象構(gòu)建壓縮字典。這些對象不包含任何記錄,或者不包含大于適合于此頁大小的最小記錄長字 典。將繼續(xù)完成該操作。如果在執(zhí)行該操作之前已經(jīng)有一個字典,則會保留該字典,而行數(shù)將取決于壓縮程度。 用戶響應(yīng): 參閱“管理日志”以確保是哪些數(shù)據(jù)對象導(dǎo)致了警告。
為了構(gòu)建壓縮字典,需要先為示例表TEST1插入部分?jǐn)?shù)據(jù)。
在DB2CLP窗口中,連上示例數(shù)據(jù)庫DB2TEST1,在示例表TEST1插入部分?jǐn)?shù)據(jù),部門編號都是“001”,備注信息都是“TEST”,編號和姓名都不相同,具體如清單2-50所示。
清單2-50 對示例表TEST1插入部分?jǐn)?shù)據(jù)
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 1 , ' AA ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 2 , ' BB ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 3 , ' CC ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 4 , ' DD ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 5 , ' EE ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 6 , ' FF ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 7 , ' GG ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 8 , ' HH ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 9 , ' II ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。
命令成功完成,這樣為示例表TEST1插入了9條記錄。部門編號都是“001”,備注信息都是“TEST”,編號和姓名都不相同。
下面對示例表TEST1創(chuàng)建一個壓縮字典,由于是第一次構(gòu)建壓縮字典,所以需要執(zhí)行帶RESETDICTIONARY選項(xiàng)的REORG命令。
在DB2CLP窗口中,對示例表TEST1發(fā)出REORG命令,執(zhí)行脫機(jī)重組,為示例表TEST1構(gòu)建壓縮字典,具體如清單2-51所示。
清單2-51 對示例表TEST1創(chuàng)建壓縮字典
C:\> db2 REORG TABLE test1 resetdictionary DB20000I REORG命令成功完成。
命令成功完成,這個命令將掃描整個表,創(chuàng)建壓縮字典,然后執(zhí)行實(shí)際表的重組,并在重組的過程中壓縮數(shù)據(jù)。由于部門編號和備注信息各行的數(shù)據(jù)都相同,所以DB2將通過分析與獲取數(shù)據(jù)中出現(xiàn)的重復(fù)模式,生成壓縮字典。
接下來繼續(xù)對示例表TEST1插入數(shù)據(jù),由于示例表TEST1的COMPRESS屬性為YES并且字典存在,所以可能會壓縮插入到頁中的數(shù)據(jù)行。此情況適用于任何插入行操作,包括通過導(dǎo)入或裝入操作來插入。
在DB2CLP窗口中,對示例表TEST1通過INSERT INTO命令插入剩余10條數(shù)據(jù),具體如清單2-52所示。
清單2-52 對示例表TEST1插入數(shù)據(jù)
C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 10 , ' JJ ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 11 , ' KK ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 12 , ' LL ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 13 , ' MM ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 14 , ' NN ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 15 , ' OO ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 16 , ' PP ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 17 , ' QQ ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 18 , ' RR ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。 C:\> DB2 INSERT INTO TEST1( ID , NAME , DEPARID , NOTE ) VALUES ( 19 , ' SS ' , ' 001 ' , ' TEST ') DB20000I SQL命令成功完成。
命令成功完成,新插入的10條記錄在數(shù)據(jù)庫中也將以壓縮的方式存儲。
如果想要估計對示例表TEST1使用表壓縮(數(shù)據(jù)行壓縮)比不使用表壓縮節(jié)省了多少空間,可以通過INSPECT ROWCOMPESTIMATE語句進(jìn)行評估分析。記住,這個命令只是估計壓縮的效果,而不是查看最終實(shí)際的壓縮效果,如果想查看實(shí)際的壓縮效果,需要查看系統(tǒng)表SYSIBM.SYSTABLES。帶壓縮估計選項(xiàng)(ROWCOMPESTIMATE)的INSPECT命令,將生成一份報告,描述節(jié)省了多少頁。語法如下:
DB2 INSPECT ROWCOMPESTIMATE TABLE NAME table_name RESULTS KEEP file_name
由于INSPECT命令生成的文件是二進(jìn)制的,無法直接查看,所以需要使用DB2INSPF命令將此文件格式轉(zhuǎn)成可讀模式才能查看,具體語法如下:
DB2INSPF file_name output_file_name
下面查看使用表壓縮方式節(jié)省了多少空間,在DB2CLP窗口中發(fā)出DB2 INSPECT命令,具體如清單2-53所示。
清單2-53 執(zhí)行DB2 INSPECT命令生成文件
C:\> DB2 " INSPECT ROWCOMPESTIMATE TABLE NAME test1 RESULTS KEEP test1.resp " DB20000I INSPECT命令成功完成。
命令成功完成。這樣就在C:\Program Files\IBM\SQLLIB\DB2下生成了一個文件test1.resp,由于這個文件是二進(jìn)制的,需要使用DB2INSPF將此文件格式轉(zhuǎn)成可讀模式才能查看,繼續(xù)在DB2CLP窗口中執(zhí)行DB2INSPF命令,具體如清單2-54所示。
清單2-54 執(zhí)行DB2INSPF命令轉(zhuǎn)換文件格式
C:\> cd C:\Program Files\IBM\SQLLIB\DB2 C:\Program Files\IBM\SQLLIB\DB2> DB2INSPF test1.resp output_test1.resp
此時打開output_test1.resp文件,可以看到通過壓縮而節(jié)省的頁數(shù)所占的百分比是56,通過壓縮而節(jié)省的字節(jié)數(shù)所占的百分比是56,由于行大小太小而不適合壓縮的行數(shù)所占的百分比是0,壓縮字典大小是8192個字節(jié),擴(kuò)充字典大小是3336個字節(jié),具體如清單2-55所示。
清單2-55 查看可讀的生成文件
DATABASE: DB2TEST1 VERSION : SQL09010 2007-10-25-21.14.03.500000 操作:ROWCOMPESTIMATE TABLE 模式名:RHETTE 表名:TEST1 表空間標(biāo)識:3 對象標(biāo)識:4 結(jié)果文件名:test1.resp 表階段開始(有符號的標(biāo)識:4,無符號的:4;表空間標(biāo)識:3):RHETTE.TEST1 數(shù)據(jù)階段開始。對象:4 表空間:3 行壓縮估計結(jié)果: 通過壓縮而節(jié)省的頁數(shù)所占的百分比:56 通過壓縮而節(jié)省的字節(jié)數(shù)所占的百分比:56 由于行大小太小而不適合壓縮的行數(shù)所占的百分比:0 壓縮字典大小:8192 個字節(jié)。 擴(kuò)充字典大小:3336 個字節(jié)。 數(shù)據(jù)階段結(jié)束。 表階段結(jié)束。 處理已完成。2007-10-25-21.14.03.562000
可以使用INSPECT ROWCOMPESTIMATE語句對壓縮的效果進(jìn)行評估分析,如果想查看實(shí)際的壓縮效果,需要查看系統(tǒng)表SYSIBM.SYSTABLES,在這個系統(tǒng)表中,有幾個新增的列是和壓縮相關(guān)的。
COMPRESSION:此參數(shù)表示對于表來說是否使用了壓縮,其有4個值,含義分別如下所示。
·N:沒有設(shè)置任何壓縮。
·V:僅僅設(shè)置了空間值壓縮。
·R:僅僅設(shè)置了數(shù)據(jù)行壓縮。
·B:既設(shè)置了空間值壓縮,也設(shè)置了數(shù)據(jù)行壓縮。
AVGROWSIZE:新增列,用來表示表的平均物理行長,包括所有壓縮和沒有壓縮的數(shù)據(jù)行,此參數(shù)用來決定每頁能存放的最大行數(shù)(對常規(guī)表空間來說,單頁最大能放255行,對于大型表空間來說,單頁最大行數(shù)會超過255行)。當(dāng)值為-1時,表示統(tǒng)計信息沒有收集。
PCTPAGESSAVED:新增列,表示使用壓縮節(jié)省空間頁的百分比。當(dāng)值為-1時,表示統(tǒng)計信息沒有收集。
PCTROWSCOMPRESSED:新增列,表示表中壓縮的行數(shù)占總行數(shù)的百分比。這個參數(shù)用來決定解壓縮時CPU的開支。當(dāng)值為-1時,表示統(tǒng)計信息沒有收集。
AVGROWCOMPRESSIONRATIO:新增列,表示所有壓縮的行的平均壓縮比例(是壓縮前的總頁數(shù)和壓縮后的總頁數(shù)的比例)。當(dāng)值為-1時,表示統(tǒng)計信息沒有收集。
AVGCOMPRSSEDROWSIZE:新增列,表示所有壓縮行在物理磁盤上的平均物理行長。當(dāng)值為-1時,表示統(tǒng)計信息沒有收集。
另外需要注意的是,如果想查看SYSIBM.SYSTABLES表中某個表的壓縮情況,需要對要查詢的表運(yùn)行RUNSTATS命令,只有這樣,上述幾個列的值才不會是-1。
下面在DB2CLP窗口中,發(fā)出RUNSTATS命令對示例表TEST1運(yùn)行統(tǒng)計信息,具體如清單2-56所示。
清單2-56 對示例表TEST1運(yùn)行統(tǒng)計信息
C:\> DB2 RUNSTATS ON TABLE RHETTE.TEST1 DB20000I RUNSTATS命令成功完成。
接下來就可以通過系統(tǒng)表SYSIBM.SYSTABLES查看示例表TEST1的壓縮情況了。繼續(xù)在DB2CLP窗口中,發(fā)出SELECT命令查看示例表TEST1的壓縮情況,具體如清單2-57所示。
清單2-57 查看示例表TEST1壓縮情況
C:\> DB2 SELECT NAME , COMPRESSION , AVGROWSIZE , PCTPAGESSAVED , PCTROWSCOMPRESSED ,AVGROWCOMPRESSIONRATIO , AVGCOMPRESSEDROWSIZE FROM SYSIBM.SYSTABLES WHERE NAME='TEST1' NAME COMPRESSION AVGROWSIZE PCTPAGESSAVED PCTROWSCOMPRESSED AVGROWCOMPRESSIONRATIO AVGCOMPRESSEDROWSIZE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TEST1 R 19 56 100 2.29223 19 1 條記錄已選擇。
可以看到示例表TEST1啟用了數(shù)據(jù)行壓縮,壓縮后的所有行的平均行長是19,壓縮后節(jié)省空間的百分比是56%(與用INSPECT命令估計的一樣),壓縮的行數(shù)占總行數(shù)的百分比是100%,壓縮前和壓縮后頁數(shù)的比例是2.29223,壓縮行的平均行長是19。
如果想查看壓縮字典的大小,可以使用ADMIN_GET_TAB_INFO表函數(shù)查看其DICTIONARY_SIZE列的值,比如想查看示例表TEST1的壓縮字典大小,可以在DB2CLP窗口中查看,具體如清單2-58所示。
清單2-58 查看示例表TEST1壓縮字典大小
C:\>db2 describe "select * from table(sysproc.admin_get_tab_info('rhette','test1')) as t" SQLDA信息 sqldaid : SQLDA sqldabc: 1204 sqln: 27 sqld: 27 列信息 sqltype sqllen sqlname.data sqlname.length - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 449 VARCHAR 128 TABSCHEMA 9 449 VARCHAR 128 TABNAME 7 453 CHARACTER 1 TABTYPE 7 501 SMALLINT 2 DBPARTITIONNUM 14 497 INTEGER 4 DATA_PARTITION_ID 17 453 CHARACTER 1 AVAILABLE 9 493 BIGINT 8 DATA_OBJECT_L_SIZE 18 493 BIGINT 8 DATA_OBJECT_P_SIZE 18 493 BIGINT 8 INDEX_OBJECT_L_SIZE 19 493 BIGINT 8 INDEX_OBJECT_P_SIZE 19 493 BIGINT 8 LONG_OBJECT_L_SIZE 18 493 BIGINT 8 LONG_OBJECT_P_SIZE 18 493 BIGINT 8 LOB_OBJECT_L_SIZE 17 493 BIGINT 8 LOB_OBJECT_P_SIZE 17 493 BIGINT 8 XML_OBJECT_L_SIZE 17 493 BIGINT 8 XML_OBJECT_P_SIZE 17 501 SMALLINT 2 INDEX_TYPE 10 453 CHARACTER 1 REORG_PENDING 13 449 VARCHAR 10 INPLACE_REORG_STATUS 20 449 VARCHAR 12 LOAD_STATUS 11 453 CHARACTER 1 READ_ACCESS_ONLY 16 453 CHARACTER 1 NO_LOAD_RESTART 15 501 SMALLINT 2 NUM_REORG_REC_ALTERS 20 453 CHARACTER 1 INDEXES_REQUIRE_REBUILD 23 453 CHARACTER 1 LARGE_RIDS 10 453 CHARACTER 1 LARGE_SLOTS 11 493 BIGINT 8 DICTIONARY_SIZE 15
如果覺得壓縮的效果不滿意,可以對表進(jìn)行解壓縮,也就是把表的COMPRESS屬性設(shè)置為NO,然后執(zhí)行傳統(tǒng)脫機(jī)表重組,這樣就把壓縮表變成了不壓縮的表了。
比如,現(xiàn)在想對示例表TEST1進(jìn)行解壓縮,可以繼續(xù)在當(dāng)前的DB2CLP窗口中,先發(fā)出ALTER TABLE命令,把示例表TEST1的COMPRESS屬性設(shè)置為NO,再運(yùn)行REORG命令執(zhí)行脫機(jī)重組,具體如清單2-59所示。
清單2-59 對示例表TEST1進(jìn)行解壓縮
C:\Program Files\IBM\SQLLIB\DB2>cd \ C:\> db2 alter table test1 compress no DB20000I SQL命令成功完成。 C:\> db2 reorg table test1 resetdictionary DB20000I REORG命令成功完成。
命令成功完成。此時示例表TEST1將不再使用表壓縮功能,并且壓縮字典將被刪除。此時再次在DB2CLP窗口中查看示例表TEST1的實(shí)際壓縮情況,可以發(fā)現(xiàn),沒有使用壓縮,有關(guān)壓縮的各個列和壓縮的時候值都不一樣了,具體如清單2-60所示。
清單2-60 查看示例表TEST1壓縮情況
C:\> DB2 SELECT NAME , COMPRESSION , AVGROWSIZE , PCTPAGESSAVED , PCTROWSCOMPRESSED ,AVGROWCOMPRESSIONRATIO , AVGCOMPRESSEDROWSIZE FROM SYSIBM.SYSTABLES WHERE NAME='TEST1' NAME COMPRESSION AVGROWSIZE PCTPAGESSAVED PCTROWSCOMPRESSED AVGROWCOMPRESSIONRATIO AVGCOMPRESSEDROWSIZE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TEST1 N 45 0 0 0 0 1 條記錄已選擇。
總結(jié)對一個新表啟用表壓縮的步驟如下。
創(chuàng)建一個表,將表的COMPRESS屬性設(shè)置為YES;
對表裝入一部分?jǐn)?shù)據(jù);
執(zhí)行帶有RESETDICTIONARY選項(xiàng)的脫機(jī)重組,創(chuàng)建一個新的壓縮字典;
將剩余的數(shù)據(jù)裝入到這個表中(裝入時考慮壓縮字典并在裝入時壓縮數(shù)據(jù))。
2.3.4 對已經(jīng)存在的表使用數(shù)據(jù)行壓縮(表壓縮)
下面看一下如何對一個已經(jīng)存在的表(表中有數(shù)據(jù)存在)啟用數(shù)據(jù)行壓縮(表壓縮)。首先需要創(chuàng)建一個示例表TEST2,并插入部分?jǐn)?shù)據(jù)。接下來發(fā)出ALTER TABLE命令對示例表TEST2指定COMPRESS屬性,運(yùn)行脫機(jī)重組命令,給示例表TEST2創(chuàng)建壓縮字典并壓縮數(shù)據(jù)。
在DB2CLP窗口中,連上示例數(shù)據(jù)庫DB2TEST1,發(fā)出CREATE TABLE命令,創(chuàng)建示例表TEST2,初始不使用表壓縮功能(不指定COMPRESS關(guān)鍵字),具體如清單2-61所示。
清單2-61 創(chuàng)建示例表TEST2
C:\> db2 connect to db2test1 數(shù)據(jù)庫連接信息 數(shù)據(jù)庫服務(wù)器 =DB2 / NT 9.1.0 SQL授權(quán)標(biāo)識 =RHETTE 本地數(shù)據(jù)庫別名 =DB2TEST1 C:\> DB2 CREATE TABLE TEST2 ( ID INTEGER , NAME VARCHAR ( 10 ) , DEPARID VARCHAR ( 10 ) , NOTE VARCHAR ( 100 ) ) IN TABLESPACE1 DB20000I SQL命令成功完成。
命令執(zhí)行成功,這樣就創(chuàng)建了示例表TEST2,其不使用表壓縮功能。接下來對示例表TEST2插入數(shù)據(jù),部門編號都是“001”,備注信息都是“TEST”,編號和姓名都不相同,具體如清單2-62所示。
清單2-62 對示例表TEST2插入部分?jǐn)?shù)據(jù)
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選項(xiàng)改成YES。下面在DB2CLP窗口中,發(fā)出ALTER TABLE命令,把示例表TEST2的COMPRESS屬性設(shè)置為YES,具體如清單2-63所示。
清單2-63 對示例表TEST2啟用COMPRESS屬性
C:\> db2 alter table test2 compress yes DB20000I SQL命令成功完成。
命令成功完成。此時示例表TEST2啟用了表壓縮功能,但是由于沒有壓縮字典的存在,所以示例表TEST2中的數(shù)據(jù)還不是以壓縮的方式存儲的。直到顯式地發(fā)出了脫機(jī)REORG命令,創(chuàng)建了壓縮字典后,示例表TEST2中的數(shù)據(jù)才會真正地壓縮存儲。
下面對示例表TEST2創(chuàng)建一個壓縮字典,由于是第一次構(gòu)建壓縮字典,所以需要執(zhí)行帶RESETDICTIONARY選項(xiàng)的REORG命令。
在DB2CLP窗口中,對示例表TEST2發(fā)出REORG命令,執(zhí)行脫機(jī)重組,為示例表TEST2構(gòu)建壓縮字典,具體如清單2-64所示。
清單2-64 對示例表TEST2創(chuàng)建壓縮字典
C:\> db2 REORG TABLE test2 resetdictionary DB20000I REORG命令成功完成。
命令成功完成。這個命令將掃描整個表,創(chuàng)建壓縮字典,然后執(zhí)行實(shí)際表的重組,并在重組的過程中壓縮數(shù)據(jù)。由于部門編號和備注信息各行的數(shù)據(jù)都相同,所以DB2將通過分析與獲取數(shù)據(jù)中出現(xiàn)的重復(fù)模式,生成壓縮字典。
如果想查看對示例表TEST2使用表壓縮(數(shù)據(jù)行壓縮)比不使用表壓縮節(jié)省了多少空間,可以通過INSPECT ROWCOMPESTIMATE語句進(jìn)行評估分析,也可以通過查看系統(tǒng)表SYSIBM.SYSTABLES查看實(shí)際的壓縮效果,具體如前面所述。
下面來總結(jié)一下表壓縮的相關(guān)內(nèi)容。
如果想對一個新表啟用表壓縮,可以按照以下步驟進(jìn)行操作。
創(chuàng)建一個表,將表的COMPRESS屬性設(shè)置為YES;
對表裝入一部分?jǐn)?shù)據(jù);
執(zhí)行帶有RESETDICTIONARY選項(xiàng)的脫機(jī)重組,創(chuàng)建一個新的壓縮字典;
裝入剩余的數(shù)據(jù)到這個表中(裝入時將考慮壓縮字典并在裝入時壓縮數(shù)據(jù))。
如果想對一個已經(jīng)存在的表(表中已經(jīng)有數(shù)據(jù))啟用表壓縮,可以按照以下步驟進(jìn)行操作。
通過ALTER TABLE命令將表的COMPRESS屬性設(shè)置為YES;
執(zhí)行帶有RESETDICTIONARY選項(xiàng)的脫機(jī)重組,創(chuàng)建一個新的壓縮字典。
數(shù)據(jù)行壓縮是基于字典的壓縮,每個字典是一個壓縮/解壓縮數(shù)據(jù)記錄的符號表。算法是基于LEMPEL-ZIV(LZ)算法,使用靜態(tài)字典,每張表一個字典,存放在永久表對象中。使用數(shù)據(jù)行壓縮的數(shù)據(jù)無論是在磁盤中還是在內(nèi)存中都是壓縮的,只有在計算前才會被解壓縮,因此極大地節(jié)約了I/O帶寬和內(nèi)存,但是增加了CPU消耗。對于壓縮的數(shù)據(jù)行其日志也是壓縮的。對于經(jīng)壓縮后不能節(jié)省存儲的行,DB2不對其進(jìn)行壓縮處理,數(shù)據(jù)(每一行)中重復(fù)的串是高壓縮比的關(guān)鍵。文本數(shù)據(jù)一般壓縮得比較好,因?yàn)槠渲型ㄖ貜?fù)字串以及大量的重復(fù)字符、前導(dǎo)或后綴空格。
需要注意的是,通過執(zhí)行CREATE TABLE或ALTER TABLE語句打開表壓縮開關(guān)時,并不壓縮數(shù)據(jù),數(shù)據(jù)僅在創(chuàng)建壓縮字典表后才能真正實(shí)現(xiàn)壓縮。壓縮字典表將在臨時內(nèi)存中創(chuàng)建,大約需臨時占用10MB內(nèi)存,臨時內(nèi)存從UTILITIES HEAP中申請。字典的分析與生成基于表中已有的數(shù)據(jù),是離線進(jìn)行的,在以后的版本中將會支持在線進(jìn)行。也就是說現(xiàn)在只能是在脫機(jī)重組時創(chuàng)建壓縮字典,在將來的版本中將支持聯(lián)機(jī)重組時創(chuàng)建壓縮字典。
需要注意的是,執(zhí)行脫機(jī)重組(REORG)時,有兩個重要的選項(xiàng)分別是RESETDICTIONARY和KEEPDICTIONARY,兩個選項(xiàng)的含義和動作都是不一樣的。
當(dāng)使用RESETDICTIONARY選項(xiàng)的REORG時,如表2-1所示。
表2-1 使用RESETDICTIONARY選項(xiàng)的REORG命令

當(dāng)使用KEEPDICTIONARY選項(xiàng)的REORG時,如表2-2所示。
表2-2 使用KEEPDICTIONARY選項(xiàng)的REORG命令

2.3.5 對表啟用空值、系統(tǒng)默認(rèn)值壓縮
除了數(shù)據(jù)行壓縮以外,以前的空值壓縮在DB2 V9中可以繼續(xù)使用。創(chuàng)建表時,可使用可選VALUE COMPRESSION子句來指定表在使用表級別也可能是列級別的節(jié)省空間的行格式。使用VALUE COMPRESSION時,不會將已指定給已定義的變長數(shù)據(jù)類型(VARCHAR、VARGRAPHICS、LONG VARCHAR、LONG VARGRAPHIC、BLOB、CLOB和DBCLOB)的空值(NULL)和零長度數(shù)據(jù)存儲在磁盤上。只有與這些數(shù)據(jù)類型相關(guān)聯(lián)的開銷值才會占用磁盤空間。如果使用了VALUE COMPRESSION,那么還可以使用可選COMPRESS SYSTEM DEFAULT選項(xiàng)來進(jìn)一步減少磁盤空間的使用量。如果插入的或更新的值等于列的數(shù)據(jù)類型的系統(tǒng)默認(rèn)值,那么使用的磁盤空間最少。默認(rèn)值將不會存儲在磁盤上。支持COMPRESS SYSTEM DEFAULT的數(shù)據(jù)類型包括所有數(shù)字類型列、定長字符和定長圖形字符串?dāng)?shù)據(jù)類型。這表示零和空格可以壓縮。要確定是否應(yīng)考慮對表進(jìn)行空間壓縮,應(yīng)了解大多數(shù)值等于系統(tǒng)默認(rèn)值或NULL值的表將受益于新的行格式。例如,假設(shè)有一個INTEGER列且列的90%的列值為0(INTEGER數(shù)據(jù)類型的默認(rèn)值)或NULL,壓縮此表和此列將受益于新的行格式并節(jié)省大量的磁盤空間。
下面創(chuàng)建示例表TEST3,其使用VALUE COMPRESSION對整個表的空值進(jìn)行壓縮,對每個列使用COMPRESS SYSTEM DEFAULT選項(xiàng)對數(shù)據(jù)類型默認(rèn)的系統(tǒng)默認(rèn)值進(jìn)行壓縮。
在DB2CLP窗口連上示例數(shù)據(jù)庫,發(fā)出CREATE TABLE命令創(chuàng)建示例表TEST3,并插入部分?jǐn)?shù)據(jù),具體如清單2-65所示。
清單2-65 創(chuàng)建示例表TEST3
C:\> db2 connect to db2test1 數(shù)據(jù)庫連接信息 數(shù)據(jù)庫服務(wù)器 =DB2 / NT 9.1.0 SQL授權(quán)標(biāo)識 =RHETTE 本地數(shù)據(jù)庫別名 =DB2TEST1 C:\> DB2 CREATE TABLE TEST3 ( ID INTEGER COMPRESS SYSTEM DEFAULT , NAME VARCHAR ( 10 ) COMPRESS SYSTEM DEFAULT , NOTE VARCHAR ( 100 ) COMPRESS SYSTEM DEFAULT ) IN TABLESPACE1 VALUE COMPRESSION DB20000I SQL命令成功完成。 C:\> db2 insert into test3 ( id , name ) values ( 0 , ' aa ') DB20000I SQL命令成功完成。 C:\> db2 insert into test3 ( id , name ) values ( 1 , ' bb ') DB20000I SQL命令成功完成。
命令成功完成。這樣就創(chuàng)建了示例表TEST3,其使用空值和默認(rèn)值壓縮。
COMPRESS SYSTEM DEFAULT指定對系統(tǒng)默認(rèn)值存儲時使用最小空間,如果VALUE COMPRESSION子句沒有被指定,將返回一個警告SQLSTATE01648,并且系統(tǒng)默認(rèn)值也不會再壓縮存儲。允許系統(tǒng)默認(rèn)值壓縮將對INSERT和UPDATE操作額外增加一些性能開支,因?yàn)樾枰~外檢查是否需要默認(rèn)值壓縮。COMPRESS SYSTEM DEFAULT子句不支持DATE、TIME、TIMESTAMP、XML和結(jié)構(gòu)化數(shù)據(jù)類型,否則會報SQLSTATE 42842錯誤。如果基本數(shù)據(jù)類型是變長字符串,則本語句將自動忽略。
可以使用DEACTIVATE VALUE COMPRESSION來指定表將不再對表中數(shù)據(jù)使用節(jié)省空間技術(shù)。如果使用DEACTIVATE VALUE COMPRESSION,這將顯式禁用與該表中的列相關(guān)聯(lián)的所有COMPRESS SYSTEM DEFAULT選項(xiàng)。
下面對示例表TEST3的ID列禁用系統(tǒng)默認(rèn)值壓縮,在DB2CLP窗口中,發(fā)出帶COMPRESS OFF選項(xiàng)的ALTER TABLE命令,具體如清單2-66所示。
清單2-66 對示例表TEST3一個列禁用系統(tǒng)默認(rèn)值壓縮
C:\> DB2 ALTER TABLE TEST3 ALTER COLUMN ID COMPRESS OFF DB20000I SQL命令成功完成。
下面對示例表TEST3使用DEACTIVATE VALUE COMPRESSION來指定表將不再對表中數(shù)據(jù)使用節(jié)省空間技術(shù),其各個列上的COMPRESS SYSTEM DEFAULT也將同時禁用。
在DB2CLP窗口中發(fā)出DEACTIVATE VALUE COMPRESSION命令,具體如清單2-67所示。
清單2-67 對示例表TEST3禁用空間節(jié)省技術(shù)
C:\> DB2 ALTER TABLE TEST3 DEACTIVATE VALUE COMPRESSION DB20000I SQL命令成功完成。
如果想對沒有啟用空值壓縮的舊表啟用空值壓縮,可以是帶ACTIVATE VALUE COMPRESSION選項(xiàng)的ALTER TABLE命令顯式地啟用空值壓縮,比如對示例表TEST3還想啟用空值壓縮,可以在DB2CLP窗口中發(fā)出ALTER TABLE命令,具體如清單2-68所示。
清單2-68 對示例表TEST3啟用空值壓縮
C:\> DB2 ALTER TABLE test3 ACTIVATE VALUE COMPRESSION DB20000I SQL命令成功完成。
如果對某個列想啟用系統(tǒng)默認(rèn)值壓縮,可以在DB2CLP窗口中發(fā)出ALTER TABLE命令,具體如清單2-69所示。
清單2-69 對示例表TEST3啟用系統(tǒng)默認(rèn)值壓縮
C:\> DB2 ALTER TABLE test3 ALTER id COMPRESS SYSTEM DEFAULT DB20000I SQL命令成功完成。
- INSTANT Mock Testing with PowerMock
- Vue.js 2 and Bootstrap 4 Web Development
- 體驗(yàn)設(shè)計原理:行為、情感和細(xì)節(jié)
- 新手學(xué)Visual C# 2008程序設(shè)計
- GitLab Repository Management
- 教孩子學(xué)編程:C++入門圖解
- Getting Started with Gulp
- Spring核心技術(shù)和案例實(shí)戰(zhàn)
- Python極簡講義:一本書入門數(shù)據(jù)分析與機(jī)器學(xué)習(xí)
- 超簡單:Photoshop+JavaScript+Python智能修圖與圖像自動化處理
- Spring Data JPA從入門到精通
- Python計算機(jī)視覺與深度學(xué)習(xí)實(shí)戰(zhàn)
- Distributed Computing with Python
- Implementing Splunk(Second Edition)
- JavaScript程序設(shè)計基礎(chǔ)教程(慕課版)