索引圧縮

宣言済み一時表または作成済み一時表の索引を含む索引は、ストレージ・コストを削減するために圧縮できます。 これは、大規模な OLTP およびデータウェアハウス環境で特に役立ちます。

デフォルトでは、索引圧縮は圧縮済みの表には有効で、非圧縮の表には無効になっています。 このデフォルトの動作は、CREATE INDEX ステートメントの COMPRESS YES オプションを使用してオーバーライドできます。 既存の索引を処理する場合、ALTER INDEX ステートメントを使用して索引圧縮を有効または無効にし、 索引の再編成を実行して索引を再作成する必要があります。

制約事項: 索引圧縮は、以下のタイプの索引ではサポートされません。
  • ブロック索引
  • XML パス索引
さらに、以下の制限があります。
  • SPECIFICATION ONLY 指定の索引は圧縮できません。
  • 一時表の索引の圧縮属性は、ALTER INDEX コマンドでは変更できません。

索引圧縮が有効になっている場合、索引ページのオン・ディスク・フォーマットおよびメモリー・フォーマットは、ストレージ・スペースを最小化するためにデータベース・マネージャーによって選択された圧縮アルゴリズムに基づいて変更されます。 得られる圧縮の度合いは、作成している索引のタイプ、および索引に含まれるデータによって異なります。 例えば、データベース・マネージャーは、重複キーのレコード ID (RID) の省略形式を保管することで、大量の重複キーがある索引を圧縮できます。 索引キーの接頭部の共通性の度合いが高い索引では、データベース・マネージャーは、索引キーの接頭部の類似性に基づき圧縮を適用できます。

圧縮に関連する制限やトレードオフもあります。 索引が共通の索引列値または部分的に共通な接頭部を共有していない場合、ストレージの削減という点での索引圧縮の効果はごくわずかです。 タイム・スタンプ列のユニーク索引の場合、同じリーフ・ページに年、月、日、時間、分、さらには秒まで共通の値が指定されていることがあるため、大幅に圧縮できる可能性がありますが、共通の接頭部が存在するかどうかを調べることはパフォーマンス低下の原因となります。

特定の状況において、圧縮するメリットがないと考える場合は、圧縮せずに索引を再作成するか、索引を変更して索引の再編成を行い、索引圧縮を無効にできます。

索引圧縮の使用を検討する際には、以下の点を考慮してください。
  • CREATE TABLE コマンドまたは ALTER TABLE コマンドで COMPRESS YES オプションを使用して行圧縮を有効にした場合、デフォルトでは、その後その表に作成される、圧縮がサポートされているすべての索引で圧縮が有効になります。ただし、CREATE INDEX コマンドまたは ALTER INDEX コマンドを使用して明示的に無効にている索引は除きます。 同様に、CREATE TABLE または ALTER TABLE コマンドを使用して行圧縮を無効する場合、その後その表に作成されるすべての索引で索引圧縮が無効になります。ただし、CREATE INDEX または ALTER INDEX コマンドを使用して明示的に有効にしている索引は除きます。
  • ALTER INDEX コマンドを使用して索引圧縮を有効にする場合、索引の再編成を実行するまで圧縮は実行されません。 同様に、圧縮を無効にする場合、索引を再編成を実行するまで索引は圧縮されたままです。
  • データベースのマイグレーション中は、マイグレーション対象の索引に対して圧縮は有効になりません。 圧縮を使用する場合は、ALTER INDEX コマンドを使用して、索引の再編成を実行する必要があります。
  • CPU の使用量は、索引の圧縮または圧縮解除に必要な処理によって多少増加することがあります。 この値が許容できない値の場合は、新規索引または既存索引の索引圧縮を無効にできます。

例 1: 索引が圧縮されているかどうかをチェックします。

次の 2 つのステートメントは、圧縮が有効な新規表 T1 を作成し、T1 に索引 I1 を作成します。
  CREATE TABLE T1 (C1 INT, C2 INT, C3 INT) COMPRESS YES 
  CREATE INDEX I1 ON T1(C1) 
デフォルトでは、T1 の索引は圧縮されます。 索引 T1 の圧縮属性 (圧縮が有効になっているかどうかを示す) は、カタログ表または管理表関数を使用してチェックできます。
 SELECT COMPRESSION FROM SYSCAT.INDEXES WHERE TABNAME='T1'
 
 COMPRESSION
 -----------
 Y

    1 record(s) selected.

例 2: 圧縮索引を再編成する必要があるかどうかを判別します。

圧縮索引を再編成する必要があるかどうかを確認するには、REORGCHK コマンドを使用します。 図 1 は、 T1: という表に対して実行されるコマンドを示しています。
図1: REORGCHK コマンドの出力
REORGCHK ON TABLE SCHEMA1.T1

Doing RUNSTATS ....


Table statistics:

F1: 100 * OVERFLOW / CARD < 5
F2: 100 * (Effective Space Utilization of Data Pages) > 70
F3: 100 * (Required Pages / Total Pages) > 80

SCHEMA.NAME                     CARD     OV     NP     FP ACTBLK    TSIZE  F1  F2  F3 REORG
----------------------------------------------------------------------------------------
Table: SCHEMA1.T1
                                 879      0     14     14      -    51861   0 100 100 ---
----------------------------------------------------------------------------------------

Index statistics:

F4: CLUSTERRATIO or normalized CLUSTERFACTOR > 80
F5: 100 * (Space used on leaf pages / Space available on non-empty leaf pages) > MIN(50, (100 - PCTFREE))
F6: (100 - PCTFREE) * (Amount of space available in an index with one less level / Amount of space required for all keys) < 100
F7: 100 * (Number of pseudo-deleted RIDs / Total number of RIDs) < 20
F8: 100 * (Number of pseudo-empty leaf pages / Total number of leaf pages) < 20

SCHEMA.NAME                 INDCARD  LEAF ELEAF LVLS  NDEL    KEYS LEAF_RECSIZE NLEAF_RECSIZE LEAF_PAGE_OVERHEAD NLEAF_PAGE_OVERHEAD  PCT_PAGES_SAVED  F4  F5  F6  F7  F8 REORG
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Table: SCHEMA1.T1
Index: SCHEMA1.I1
                                879    15     0    2     0     682           20            20                596                 596               28  56  31   -   0   0 -----
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

例 3: 索引圧縮で節約される可能性があるスペース量を判別します。

索引圧縮で節約される可能性があるスペース量を計算する方法の例については、ADMIN_GET_INDEX_COMPRESS_INFO 表関数の資料を参照してください。