アダプティブ圧縮

アダプティブ圧縮により、クラシック行圧縮を単独で使用して得られるより圧縮率が向上します。 アダプティブ圧縮にはクラシック行圧縮が組み込まれていますが、ページ単位でも動作して、さらにデータを圧縮します。 Db2® 製品のさまざまなデータ圧縮技法のうち、アダプティブ圧縮は、ストレージ節約のための最も劇的な可能性を提供します。

アダプティブ圧縮の動作

アダプティブ圧縮では、実際には 2 つの圧縮方法が使用されます。 1 つ目の方法では、クラシック行圧縮で使用されるのと同じ表レベルのコンプレッション・ディクショナリーを使用して、表全体からサンプリングされたデータに含まれる反復に基づいてデータを圧縮します。 2 つ目の方法では、ページ・レベルのディクショナリーを基にした圧縮アルゴリズムを使用して、各データ・ページ内のデータの反復に基づいた圧縮を行います。 ディクショナリーは、反復するバイト・パターンをより短いシンボルにマップし、そのシンボルで、表内のより長いバイト・パターンを置換します。 表レベルのコンプレッション・ディクショナリーは、そのディクショナリーが作成された対象の表オブジェクト内に保管され、表全体のデータの圧縮に使用されます。 ページ・レベルのコンプレッション・ディクショナリーは、データとともにデータ・ページに保管され、そのページ内のデータの圧縮にのみ使用されます。 圧縮データにおけるこれらの各辞書の役割について詳しくは、 圧縮辞書を参照してください。

注: 表レベルのコンプレッション・ディクショナリーを使用することによってのみ、クラシック行圧縮を使用して表を圧縮することを指定できます。 しかし、ページ・レベルのコンプレッション・ディクショナリーのみを使用して表を圧縮するように指定することはできません。 アダプティブ圧縮には、表レベルのコンプレッション・ディクショナリーとページ・レベルのコンプレッション・ディクショナリーの両方を使用します。

圧縮に適したデータ

データ行の中に 保管されているデータ (インライン化された LOB 値または XML 値を含む) は、アダプティブ圧縮とクラシック行圧縮の両方で圧縮することができます。 XML ストレージ・オブジェクトは、静的圧縮を使用して圧縮できます。 ただし、表の行の外に保管されている LONG データ・オブジェクト用のストレージ・オブジェクトは圧縮されません。 また、ログ・レコード自体は圧縮されませんが、挿入、更新、または削除の操作の結果として書き込まれるログ・データの量は、行が圧縮されることで減少します。

制約事項: Db2 バージョン 9.5 または Db2 バージョン 9.1で作成した XML 列のデータを圧縮することはできません。 ただし、Db2 バージョン 9.7 以降を使用して表に追加するインライン XML 列は、その表に以前のリリースの製品で作成した XML 列が含まれていなければ圧縮できます。 以前のリリースの製品で作成した表に、 XML 列が既に 1 つ以上ある場合に、 Db2 バージョン 9.7 以降を使用して圧縮 XML 列を追加するには、 圧縮を使用する前に、まず ADMIN_MOVE_TABLE ストアード・プロシージャーを使用して表をマイグレーションする必要があります。

アダプティブ圧縮の使用または不使用

表データを圧縮するには、表の COMPRESS 属性を YESに設定します。 この属性は、 CREATE TABLE ステートメントの実行時に新しい表に対して設定することも、 ALTER TABLE ステートメントの実行時に既存の表に対して設定することもできます。 圧縮を有効にすると、INSERTLOAD INSERT、または IMPORT INSERT コマンド操作などの表にデータを追加する操作でアダプティブ圧縮が使用されます。 さらに、その表の新規索引の索引圧縮が有効になります。 非圧縮索引として指定しない限り、圧縮できるタイプの索引であれば、索引は圧縮索引として作成されます。
重要: 表に対してアダプティブ圧縮を有効にすると、表が複数の表パーティションで構成されている場合でも、表全体に対して有効になります。

表圧縮を無効にするには、COMPRESS NO オプションを指定した ALTER TABLE ステートメントを使用します。 これで、それ以降に追加される行は圧縮されません。 既存の行は、圧縮されたままになります。 圧縮をオフにした後で表全体を抽出するには、REORG TABLE コマンドを使用して表を再編成する必要があります。

ログおよび圧縮された表に対する更新アクティビティーの影響

更新アクティビティー、およびデータ行内のどの場所が更新されるかに応じて、ログの使用量は増える場合があります。 表の列の順序が更新ロギングに与える影響については、 更新ロギングを最小化するための列の順序を参照してください。

新規データが追加されてその行のサイズが大きくなる場合、新しくなった行が、現在のデータ・ページに収まらなくなる可能性があります。 行の新しいイメージは、そこにではなく、オーバーフロー・ページに格納されます。 ポインター・オーバーフロー・レコードの作成を最小限にするには、PCTFREE オプションを指定した ALTER TABLE ステートメントを使用して、再編成後に各ページに残すフリー・スペースのパーセンテージを増やします。 例えば、圧縮を有効にする前に PCTFREE オプションを 5% に設定していた場合、圧縮を有効にする際には 10% に変更します。 各ページに残すフリー・スペースのパーセンテージを増やすことは、頻繁に更新されるデータの場合には特に重要です。

一時表の圧縮

一時表の圧縮は、データベース・マネージャーが価値があると判断した場合に自動的に有効になります。 一時表の圧縮は、ユーザーが有効または無効にすることはできません。 一時表にはクラシック行圧縮のみが使用されます。

システム一時表
照会の実行時、Db2 オプティマイザーは、圧縮を使用する価値があるかどうかを判別するために、システムが作成した一時表の圧縮がもたらすストレージの節約効果と照会パフォーマンスへの影響を考慮します。 その価値があれば、クラシック行圧縮が自動的に使用されます。 圧縮を使用する前の表の最小サイズは、 一時表の場合、通常の表よりも大きくなります。
ユーザー作成の一時表
作成済みのグローバル一時表 (CGTT) および宣言済みのグローバル一時表 (DGTT) は、常にクラシック行圧縮を使用して圧縮されます。

Explain 機能 または db2pd ツール を使用して、オプティマイザーがシステム一時表の圧縮を使用したかどうかを確認できます。

圧縮によって解放されたスペースの再利用

データ圧縮によって解放されたスペースを再利用できます。 詳しくは、 再利用可能ストレージを参照してください。