拡張行サイズ

拡張行サイズのサポートにより、ユーザーは、表スペースのページ・サイズに応じた最大レコード長を超える長さの行を持つ表を作成できます。

表データの行は、4 KB、8 KB、16 KB、および 32 KB の 4 つのサイズを使用できるページと呼ばれるブロックに編成されます。 特定サイズの表スペース内に作成される表については、ページ・サイズがすべて一致するものとなります。
表 1. 表スペースのページ・サイズごとの列数および行サイズの制限
ページ・サイズ 行サイズの制限 列数の制限
4 K 4 005 500
8 K 8 101 1 012
16 K 16 293 1 012
32 K 32 677 1 012
拡張行サイズがサポートされていない場合、表の 1 行に使用できる最大バイト数は、表スペースのページ・サイズによって決まります。 行の長さがページ・サイズの最大レコード長を超える表を作成しようとすると、エラー (SQLSTATE 54010) が発生します。 例えば、ページ・サイズが 4 K の表スペースでは、以下の表は、行のサイズが原因で作成することができません。
CREATE TABLE T1 (C1 INTEGER, C2 VARCHAR(5000))
この表の行サイズは 5010 バイトです。計算方法は、5 バイト (C1 に NULL 可能列のオーバーヘッドを加算) + 5005 バイト (C2 に可変長列のオーバーヘッドを加算) です。

拡張行サイズがサポートされている場合は、表スペースのページ・サイズの最大レコード長を超える大きな行を含む表を作成することができます。 拡張行サイズのサポートにより、4 K ページ・サイズの表スペースに表 T1 を作成できます。

拡張行サイズのサポートは以下の目的に使用できます。
  • 32 K を超える行サイズの表を Db2® バージョン 10.5にマイグレーションします。
  • ほとんどのデータ行は小さいページに収まるが、表定義でより大きいページ・サイズが必要とされている場合に、アプリケーションのパフォーマンスを向上させる。
  • VARCHAR または VARGRAPHIC 列を増やして表を作成する。 列の最大数は変わりませんが、ページ・サイズの最大レコード長は超えられるため、列を増やすことは可能です。

既存の表を変更することで、拡張行サイズのサポートを利用できます。 例えば、列を追加したり、文字ストリング列やグラフィック・ストリング列を長くしたりできます。 拡張行サイズのサポートがない場合、これらの変更を行うと、表スペースのページ・サイズに対する行サイズを超えてしまうことになります。

ユーザーが作成する 行オーガナイズ 表は、範囲がクラスター化された表 (RCT) を除き、拡張行サイズをサポートします。

拡張行サイズを使用する表

表の拡張行サイズのサポートを有効にするには、以下の要件があります。
  1. extended_row_sz データベース構成パラメーターを ENABLE に設定する必要があります。
  2. 表定義に 1 つ以上の可変長ストリング列 (VARCHAR または VARGRAPHIC) を含める必要があります。
  3. 表の行サイズは 1048319 バイトを超えることはできません (SQLSTATE 54010)。
  4. 拡張行が存在する明示的または暗黙的なシステム一時表を必要とする照会は、行の最小幅を完全に格納できるシステム TEMPORARY 表スペースを必要とします。 行の最小幅を計算する方法は最大幅の場合と同様ですが、異なる点として、すべての VARCHAR 列および VARGRAPHIC 列の長さを 1 と想定します。

拡張行サイズのサポートを使用する表は、SYSCAT.TABLES カタログ・ビューの EXTENDED_ROW_SIZE 列を確認することで識別できます。

拡張行サイズ・サポートを使用する既存の表は、extended_row_sz データベース構成パラメーターを DISABLE に設定しても影響を受けません。 既存の表に対してこれをオフにする必要がある場合は、最大レコード長がページ・サイズ制限を超えないように、表定義を変更するか、より大きいページ・サイズの表スペースに移動してください。

拡張行サイズ・サポートを使用する表へのデータの挿入
データ行が拡張行サイズ・サポートを使用する表で挿入または更新されており、物理データ行の長さが表スペースの最大レコード長を超えている場合、可変長ストリング列 (VARCHAR または VARGRAPHIC) のサブセットは、データ行外にラージ・オブジェクト (LOB) データとして保管されます。 ベースの行内の表列は、サイズが 24 バイトの記述子で置換されます。 VARCHAR(n) (n は 24 以下)、または VARGRAPHIC(n) (n は 12 以下) の列の場合、基本データ行のデータはそのままです。

一部の VARCHAR データまたは VARGRAPHIC データが行の外部に LOB データ・オブジェクトとして保管されている場合、データ・タイプは変更されません。 VARCHAR または VARGRAPHIC 列は LOB 列にはなりません。 IMPORT、EXPORT、および LOAD などの操作では、VARCHAR または VARGRAPHIC データの処理に LOB 修飾子は必要ありません。

以下の例では、extended_row_sz データベース構成パラメーターが ENABLE に設定されています。
表スペースを指定せずに表を作成する
以下の CREATE TABLE ステートメントが発行されます。
CREATE TABLE T1 (C1 INT, C2 VARCHAR(4000));
T1 の行サイズは 4010 バイトです。 ページ・サイズが 8 K 以上の表スペースが見つからない場合、T1 は 4 K のページ・サイズの表スペースに作成されます。 必要に応じて、一部の可変長データが行の外部に保管される可能性があります。 4 K のページ・サイズの使用可能な表スペースがない場合は、エラー (SQLSTATE 42727) が返されます。
列の追加
T1 は、以下の CREATE TABLE ステートメントを使用して作成されました。
CREATE TABLE T1 (C1 INT, C2 VARCHAR(3995)) in TS1;
表スペース TS1 のページ・サイズは 4 K であるため、バイト・カウントが 4005 である表 T1 は、どのデータも行の外部に保管する必要なく作成されます。 以下の ALTER TABLE ステートメントを使用して、新しい列を表 T1 に追加します。
ALTER TABLE T1 ADD C3 CLOB(1M);
この時点で、表のバイト数は最大レコード長を超えます。 extended_row_sz データベース構成パラメーターが ENABLE に設定されているため、ALTER TABLE は成功しました。
VALUE COMPRESSION の非アクティブ化
T1 は、以下の CREATE TABLE ステートメントを使用して作成されました。
CREATE TABLE T1 (C1 INT, C2 VARCHAR(1993), C3 VARCHAR(2000))
 IN TS1 VALUE COMPRESSION;
表スペース TS1 のページ・サイズは 4 K で、表 T1 のバイト・カウントは 4005 であるため、行外に保管されるデータはありません。 以下の ALTER TABLE ステートメントを使用して、表 T1 の圧縮を非アクティブ化します。
ALTER TABLE T1 DEACTIVATE VALUE COMPRESSION;
このステートメントにより、表 T1 のバイト・カウントが 4008 に変更されます。 extended_row_sz データベース構成パラメーターが ENABLE に設定されているため、ALTER TABLE は成功しました。 必要に応じて、行外に一部の可変長データが保管される可能性があります。

VALUE COMPRESSION が再アクティブ化されると、VARCHAR データの後続の挿入はすべて基本行に保管されます。 VALUE COMPRESSION が非アクティブ化されたときに挿入された行はすべて、更新されるか、表 T1 が再編成されるまで、行の外に残ります。

索引の作成
T1 は、以下の CREATE TABLE ステートメントを使用して作成されました。
CREATE TABLE T1
 (C1 INT, C2 VARCHAR(1000),
  C3 VARCHAR(1000),
  C4 VARCHAR(1000),
  C5 VARCHAR(1000))
 IN TS1;
表スペース TS1 のページ・サイズは 4 K で、extended_row_sz データベース構成パラメーターが ENABLE に設定されているため、表 T1 は正常に作成されます。 表 T1 に索引を作成するために特別な処理は必要ありません。
CREATE INDEX I1 on T1 (C2);
CREATE INDEX I2 on T1 (C3);
CREATE INDEX I3 on T1 (C4);
CREATE INDEX I4 on T1 (C5);