DB2 V9.7啟用索引壓縮大揭秘
此文章主要向大家描述的是DB2 V9.7啟用索引壓縮的實際操作步驟,我們大家都知道在缺省情況下,當(dāng)對相關(guān)表啟動壓縮后,一般的情況下索引壓縮也處在啟動狀態(tài)。對于未壓縮的表索引壓縮處于禁用狀態(tài)。
我們可以使用 CREATE INDEX 語句的 COMPRESS YES 選項可以更改此缺省行為。創(chuàng)建索引之后,我們還可以使用 ALTER INDEX 語句來啟用或禁用索引壓縮功能;然后,必須執(zhí)行 INDEX REORG 以重建索引。
啟用索引壓縮功能后,DB2 將根據(jù)數(shù)據(jù)庫管理器所選擇的壓縮算法對索引頁在磁盤上和內(nèi)存中的格式進行修改,以便最大程度地減少存儲空間耗用量。根據(jù)所創(chuàng)建索引類型以及索引所包含數(shù)據(jù)的不同,DB2 實現(xiàn)的壓縮程度也會有所變化。
例如,通過存儲重復(fù)鍵的記錄標(biāo)識(RID)的縮寫格式,數(shù)據(jù)庫管理器可以對包含大量重復(fù)鍵的索引進行壓縮。在索引鍵前綴的公共程度很高的索引中,數(shù)據(jù)庫管理器可以根據(jù)索引鍵前綴的相似性來進行壓縮。
索引壓縮是使用 CPU 的空閑周期或者是 CPU 在等待 IO 時的周期對索引數(shù)據(jù)進行壓縮、解壓縮的。因此在帶來 IO 成本節(jié)約的同時,索引壓縮技術(shù)增加了系統(tǒng)的 CPU 負擔(dān),如果我們的系統(tǒng)不受到 CPU 的約束,我們在對數(shù)據(jù)進行 Select、Insert、Update 時都能感覺到索引壓縮技術(shù)帶來的性能提升。
如果我們的系統(tǒng)本身 CPU 就已經(jīng)比較繁忙了,再啟用索引壓縮可能會帶來一些負面影響。
清單 1. 創(chuàng)建表時指定表壓縮
- db2 "create table t1 (col1 int) compress yes"
- db2 "create index idx_col1 on t1(col1) "
- db2 "select substr(INDNAME,1,18),substr(TABNAME,1,18),COMPRESSION,PCTPAGESSAVED
- from syscat.indexes where tabname='T1'"
- 1 2
- COMPRESSION PCTPAGESSAVED
- IDX_COL1 T1 Y -1
上面的語句中首先創(chuàng)建了一張表 T1,并對該表啟動行壓縮。在創(chuàng)建索引 idx_col1 時,由于基表啟動了壓縮,DB2 V9.7索引壓縮也被自動啟動。上述代碼的第三句就是驗證索引 idx_col1 確實啟動了壓縮,而由于未收集統(tǒng)計信息因此當(dāng)前壓縮比例是 -1 。當(dāng)我們向表中 Insert 或者 Update 數(shù)據(jù)時,索引自動被壓縮維護到物理存儲上。
如果我們在創(chuàng)建表時未指定表進行壓縮,那么此表上創(chuàng)建的索引默認情況下是不壓縮的,如果期望對索引進行壓縮需要進行以下步驟。
- db2 "create table t2 (col1 int)
- db2 "create index idx_col2 on t2(col1) "
- db2 "select substr(INDNAME,1,18),substr(TABNAME,1,18),COMPRESSION,PCTPAGESSAVED
- from syscat.indexes where tabname='T2'"
- 1 2 COMPRESSION PCTPAGESSAVED
- IDX_COL2 T2 N
- -1
- db2 "alter index idx_col2 compress yes"
- db2 "select substr(INDNAME,1,18),substr(TABNAME,1,18),COMPRESSION,PCTPAGESSAVED
- from syscat.indexes where tabname='T2'"
- 1 2 COMPRESSION PCTPAGESSAVED
- IDX_COL2 T2 Y -1
上面語句中開始創(chuàng)建表時未指定表進行壓縮,后繼創(chuàng)建的索引默認情況下不壓縮。如果希望索引啟動壓縮功能,則可以使用 alter 語句進行更改。
注意,即使我們更改將索引更改為壓縮后,后來插入的數(shù)據(jù)還是未壓縮的,直到我們使用 reorg 語句重組索引。 DB2 考慮中間更改索引的壓縮屬性,需要對更改前、更改后的插入的數(shù)據(jù)保持一致性,不可能在索引中同時存在非壓縮、壓縮數(shù)據(jù)。
我們對上面的 IDX_COL2 執(zhí)行以下腳本,插入 1 萬行數(shù)據(jù):
- INSERT INTO t2 (col1)
- WITH TEMP (COUNTER, col1) AS
- (
- VALUES (0, INT(RAND() * 1000))
- UNION ALL
- SELECT
- (COUNTER + 1), INT(RAND() * 1000)
- FROM
- TEMP
- WHERE
- (COUNTER + 1) < 10000
- )
- SELECT
- col1
- FROM
- TEMP
- ;
然后我們收集表和索引的統(tǒng)計信息。
- db2 "runstats on table db2admin.t2 and indexes all"
- db2 "select substr(INDNAME,1,18),substr(TABNAME,1,18),COMPRESSION,PCTPAGESSAVED
- from syscat.indexes where tabname='T2'"
- 1 2 COMPRESSION PCTPAGESSAVED
- IDX_COL2 T2 Y 0
大家會發(fā)現(xiàn)壓縮率為 0,這是因為我們還沒有對索引進行 reorg 。當(dāng)然,除了上面 Select 語句我們也可以使用 REORGCHK 工具檢查是否需要對索引進行 Reorg 。
- db2 "reorg indexes all for table db2admin.t2"
- db2 "runstats on table db2admin.t2 and indexes all"
- db2 "select substr(INDNAME,1,18),substr(TABNAME,1,18),COMPRESSION,PCTPAGESSA
- VED from syscat.indexes where tabname='T2'"
- 1 2 COMPRESSION PCTPAGESSAVED
- IDX_COL2 T2 Y 40
- TAG: db2 DB2 dB2
以上的相關(guān)內(nèi)容就是對DB2 V9.7 如何啟用索引壓縮的介紹,望你能有所收獲。
【編輯推薦】