表レベルのコンプレッション・ディクショナリー作成

アダプティブ圧縮またはクラシック行圧縮を有効にした表の表レベルのコンプレッション・ディクショナリーは、自動または手動で作成できます。 アダプティブ圧縮を有効にした表には、常に自動で作成されるページ・レベルのデータ・ディクショナリーが含まれます。

ディクショナリー自動作成

Db2® バージョン 9.5以降、以下の各条件が満たされると、表レベルのコンプレッション・ディクショナリーが自動的に作成されます。
  • COMPRESS YES ADAPTIVE 節または COMPRESS YES STATIC 節を持つ CREATE TABLE ステートメントまたは ALTER TABLE ステートメントを使用して、表の COMPRESS 属性を設定している。
  • 表の表レベルのコンプレッション・ディクショナリーがまだ存在していない。
  • 表には、反復データのディクショナリーを構成するのに十分なデータが含まれます。
圧縮が有効になっている場合、ディクショナリーの作成後に表に移動させたデータは、そのディクショナリーを使用して圧縮されます。
次の図は、コンプレッション・ディクショナリーが自動的に作成されるためのプロセスを示しています。
ディクショナリー自動作成
図の中に描かれているイベントの順序は以下のようになります。
  1. 表が空のため、コンプレッション・ディクショナリーはまだ作成されません。
  2. 挿入またはロード操作を使用してデータが表に挿入されますが、非圧縮のままです。
  3. さらに多くのデータが表に挿入またはロードされますが、データは非圧縮のままです。
  4. しきい値に達すると、COMPRESS 属性が YES ADAPTIVE または YES STATIC に設定されている場合には、ディクショナリー作成が自動的に起動されます。
  5. ディクショナリーが作成されます。
  6. ディクショナリーが表に追加されます。
  7. この時点から表レベルの圧縮が使用可能になり、その後に挿入または追加される行は、表レベルのコンプレッション・ディクショナリーによって圧縮されます。
重要: ディクショナリーが作成される前に表に存在していた行は、変更しない限り、またはディクショナリーを手動で再作成しない限り、圧縮解除されたままになります。
表が Db2 バージョン 9.7 以降で作成されており、XML タイプの列が少なくとも 1 つある場合は、第 2 のコンプレッション・ディクショナリーが作成されます。 このディクショナリーは、表に関連付けられたデフォルトの XML ストレージ・オブジェクトに保管されている XML データの圧縮に使用されます。 XML データのコンプレッション・ディクショナリーは、以下の各条件が満たされると自動的に作成されます。
  • 表の COMPRESS 属性を YES ADAPTIVE または YES STATIC に設定した。
  • その XML ストレージ・オブジェクト内に、コンプレッション・ディクショナリーが存在していない。
  • XML ストレージ・オブジェクト内に十分なデータが存在する。
制約事項: Db2 バージョン 9.5 または Db2 バージョン 9.1で作成した XML 列のデータを圧縮することはできません。 ただし、Db2 バージョン 9.7 以降を使用して表に追加するインライン XML 列は、その表に以前のリリースの製品で作成した XML 列が含まれていなければ圧縮できます。 以前のリリースの製品で作成した表に、 XML 列が既に 1 つ以上ある場合に、 Db2 バージョン 9.7 以降を使用して圧縮 XML 列を追加するには、 圧縮を使用する前に、まず ADMIN_MOVE_TABLE ストアード・プロシージャーを使用して表をマイグレーションする必要があります。

一時表用に表レベルのコンプレッション・ディクショナリーを作成するメカニズムは、永続表用の作成メカニズムと似ています。 ただし、一時表に対してクラシック行圧縮を使用するかどうかは、照会の複雑度や結果セットのサイズといった要因に基づいて、データベース・マネージャーが自動的に決定します。

ディクショナリー手動作成

圧縮対応の表が十分なサイズになると、ディクショナリーは自動的に作成されますが、 RESETDICTIONARY パラメーターを指定した REORG TABLE コマンドを使用して、存在しない場合は表レベルのコンプレッション・ディクショナリーを強制的に作成することもできます。 このコマンドは、表に少なくとも 1 行のデータがあれば、 コンプレッション・ディクショナリーを強制的に作成します。 表の再編成はオフラインの操作です。 ディクショナリー自動作成を使用する利点の 1 つは、ディクショナリーの作成中に 表がオンラインのままであることです。

新規ディクショナリーを強制的に作成するには、 REORG TABLE コマンドを使用する代わりに、 INSPECT コマンドを使用する際に ROWCOMPESTIMATE パラメーターを指定することもできます。 このコマンドは、 表に既存のものがない場合、コンプレッション・ディクショナリーを作成します。 この方法を表の再編成を実行する手法と比較した場合の利点は、表がオンラインのままであることです。 後で追加される行は圧縮の対象となりますが、INSPECT コマンドを実行する前に存在していた行は、表の再編成が実行されるまで非圧縮のままです。 ただし、圧縮が有効になっている場合、自動ディクショナリー作成は通常、圧縮をアクティブにした直後に実行されます。これは、 INSPECT コマンドを使用する機会がある前に実行される可能性があります。

コンプレッション・ディクショナリーのリセット

表レベルのコンプレッション・ディクショナリーが自動または手動のどちらで作成されたかに関わらず、ディクショナリーは静的です。つまり、作成後は変更されません。 行を追加または更新すると、 それらの行は、コンプレッション・ディクショナリーにあるデータに基づいて圧縮されます。 多くの場合、この動作は妥当です。 例えば、市水道施設の顧客アカウントを維持するために使用されるデータベースの表について 考えてみます。 表には、STREET_ADDRESS、CITY、PROVINCE、 TELEPHONE_NUM、POSTAL_CODE、および ACCOUNT_TYPE といった列があると考えられます。 このような表のデータでコンプレッション・ディクショナリーを作成した場合には、たとえ中程度のサイズの表であっても、クラシック行圧縮でスペースを大幅に節約できる反復情報は、おそらく十分に存在します。 データの多くが、顧客間で共通している可能性があります。 例えば、CITY 列、POSTAL_CODE 列、または PROVINCE 列の値や、STREET_ADDRESS 列または TELEPHONE_NUM 列の値の一部などがこれにあたります。

一方、時間の経過とともに大きく変化する表もあります。 以下のような小売販売データに使用される表を考えてみます。
  • 月ベースでデータを集計するためにマスター表が使用されます。
  • この表には、レコードの新しいセットが毎月ロードされます。
この場合、例えば 4 月に作成されたコンプレッション・ディクショナリーは、その年の後半の販売に関する反復データを反映していないと考えられます。 表のデータが時間の経過とともに大きく変化する場合は、 REORG TABLE コマンドに RESETDICTIONARY パラメーターを指定して使用することによって、 コンプレッション・ディクショナリーをリセットしてもよいでしょう。 コンプレッション・ディクショナリーをリセットすることの利点は、ディクショナリーの作成時に表全体のデータが考慮されるという点です。