データのロードとアンロード

このドキュメントでは、次のトピックについて説明します。


はじめに

データベースにデータをロードするにはいくつかの方法があります。

  • ADAMUP ユーティリティを使用:ADACMP、ADAMUP または ADAULD によって生成された圧縮データをロードできます。

  • ADABCK ユーティリティを使用:ADABCK によって作成されたバックアップからファイルまたはデータベースをリストアできます。

  • ADAORD ユーティリティの IMPORT 機能を使用:ADAORD の EXPORT 機能によって作成されたファイルをインポートできます。

圧縮データ

ADAMUP ユーティリティでデータベースにロードされるデータは、特別に圧縮したデータフォーマットで ADAMUP への入力にする必要があります。圧縮データはユーティリティ ADACMP(圧縮解除したデータを「非圧縮データフォーマット」セクションの説明のように、必要なフォーマットに変換する)で生成することができます。既存データをデータベースからアンロードするとき、ユーティリティ ADAMUP および ADAULD で圧縮データを生成することもできます。

データフォーマットとして柔軟性に富んだフォーマットです。データファイルを圧縮してから、そのファイルを必要に応じて別々のデータベースにロードすることも、1 つのデータベースにロードすることもできます。また、レコードのサブセットだけをファイルにロードすることもできます。

このファイルのフォーマットの不便な点は、データをデータベースにロードするときに、Adabas が各ファイルにソートインデックスを構築する必要があるということです。ファイル数が多い場合、これは、大量の CPU タイムを必要とし、SORT および TEMP コンテナファイルを必要とします。

バックアップデータ

バックアップデータはユーティリティ ADABCK で生成します。このようなデータを使用して長期間データアーカイブを作成することができます。また、ファイルをデータベースにリストアしたり、データベース全体をリストアしたりするために使用することもできます。

バックアップおよびリストア処理は、データの保存やリストアの他の方法より高速に行われます。ただし、元のデータベースにバックアップファイルを常にコピーしなければなりません。また、異なるファイル番号でファイルをコピーすることもできません。

データのインポート/エクスポート

ADAORD EXPORT 機能を使用してデータベースからエクスポートされたデータは、ADAORD IMPORT 機能を使用してデータベースにインポートすることができます。エクスポートされたデータは前述の圧縮データとフォーマット上、非常に類似していますが、おもな違いは、エクスポートされたファイルのインデックス情報もエクスポートされることです。これは、データを続けてインポートしても、インデックスの再構築が不要なので、ADAMUP に相当する別の処理よりも、ロード手順が非常に高速であることを意味します。また、SORT および TEMP コンテナファイルは必要ありません。

圧縮データと同様に、これは柔軟なデータフォーマットです。データファイルを圧縮してから、そのファイルを必要に応じて別々のデータベースにロードすることも、1 つのデータベースにロードすることもできます。ただし、インデックス情報はエクスポートファイルに格納されるので、レコードのサブセットだけをデータベースのファイルにインポートすることはできません。

他のハードウェアアーキテクチャへのデータのコピー

ある Adabas データベースから、異なるハードウェアアーキテクチャを使用しているコンピュータ上の別のデータベースに、データをコピーすることが必要になる場合があります。たとえば、UNIX プラットフォームから Windows プラットフォームにコピーする場合などです。

この目的のために、ユーティリティ ADABCK(バージョン 6.4 以降)を使用できます。これを使用すれば、あるハードウェアアーキテクチャ上で作成したバックアップを、別のアーキテクチャを使用しているコンピュータ上のデータベースに復元できます。

注意:

  1. この方法は、バージョン 6.3 より前の Adabas で作成されたバックアップでは実行できません。
  2. この方法を使用した、メインフレームとの間でのデータコピーはサポートされていません。
  3. 異なるハードウェアアーキテクチャで作成された入力ファイルの処理は、ADABCK でのみ可能です。ユーティリティ ADAMUP と ADAORD では処理できません。
  4. 以前の Adabas バージョンで必要とされていた古い方法を使用して、別のハードウェアアーキテクチャにデータをコピーすることもできます。その方法とは、ユーティリティ ADAULD を使用してファイルをアンロード、ユーティリティ ADADCU を使用してファイルを圧縮解除、ユーティリティ ADACMP を使用して新しいアーキテクチャ用にファイルを圧縮、ADAMUP を使用してファイルをロード、という手順を使用する方法です。これは、ブロックサイズやファイルの FDT を変更する場合にも便利です。

非圧縮データフォーマット

このセクションでは、ユーティリティ ADACMP への入力であるデータレコードと、ユーティリティ ADADCU からの出力であるデータレコードのフォーマットについて説明します。このフォーマットは非圧縮データフォーマットといいます(未加工データフォーマットともいう)。ユーティリティ ADACMP は、このフォーマットでデータを読み取り、後続の一括更新ユーティリティ ADAMUP への入力のためにそれを圧縮します。ユーティリティ ADADCU は反対の処理を行います。これは、ADACMP が生成した圧縮データを圧縮解除します。圧縮データは、データを削除またはデータベースからアンロードするとき、ユーティリティ ADAMUP および ADAULD によって生成できることにも注意してください。

特に指示がない限り、記述されたデータフォーマットは ADACMP に対する入力データおよび ADADCU に対する出力データの両方に適用します。

非圧縮データレコードの構文

非圧縮データレコードは、次の構文要素の順で構成されています。

format_buffer_element 
field_references

field_references を除く構文要素は、『コマンドリファレンス』の「Adabas の呼び出し」のフォーマットバッファとレコードバッファで説明されているフォーマットバッファ要素と同じです。ここでは、nX、リテラル、または長さおよびフォーマット指定を含むフィールド定義が存在する場合は、フォーマットバッファ要素はこれらの要素になります。相違点は、次の構文要素の区切り方法です。

  • 1 つの構文要素は、1 行に入力されなければなりません。

  • 構文要素は、コンマまたは改行によって区切られます。

  • 構文要素間にコメントを挿入できます。セミコロンは、後続の文字が改行されるまではそれがコメントであることを示します。

  • 構文要素間に FDT を挿入できます。FDT は新規行で入力する必要があります。これにより、非圧縮データレコード構文が指定されたユーティリティは、FDT を表示するように指示されます。

次の特別な考慮事項は、非圧縮レコード構造指定で指定されたフォーマットバッファ要素に適用されます。

  • 編集マスクは使用できません。

  • N 要素は使用できません。

  • 1-N 要素の同一行内の直前には、対応する C 要素を付加する必要があります。更新または格納コマンドのフォーマットバッファとは異なり、これらの要素は圧縮用のフォーマットバッファでも使用できます。

    GB は、BA、BB および BC フィールドからなるピリオディックグループと仮定します。

    GBC,GB1-N ピリオディックグループのオカレンスの回数分だけ、ピリオディックグループのオカレンスが繰り返されて、GBC、BA1、BB1、BC1、BA2、BB2、BC2 というように展開されます。
  • 1-N 要素は、PE 内のフィールドでは使用できません。

無効な指定の例

GB2-GB4 構文に誤りがあります。
GB4-2 範囲の下限の方が上限よりも大きくなっています。
GBC
GB1-N
GBC と GB1-N は同じ行に指定する必要があります。
GBC,BA1-N ピリオディックグループにフィールドを指定する場合は、1-N を指定することはできません。

field_references の構文

name R [mu_pe_index] [, length ]

name は LOB フィールドの名前です。非圧縮レコード指定にフィールド参照が含まれている場合、非圧縮レコードには LOB 値自身は含まれませんが、LOB 値が含まれているファイルの名前が含まれます。

length には、0 以上の数値または ‘*’ を指定できます。length=* は、単一の LOB 値のレコードの終わりでのみ許可されます。length=0 が指定されると、2 バイトの包括長さバイトがファイル名の先頭に付加されます(LA フィールドと同様)。デフォルトは 0 です。

mu_pe_index の構文

{ i [-j] | N} [ (m [-n] | N | 1-N) ]| 1 – N

MU フィールドまたはピリオディックグループ内のフィールドが LOB フィールドである場合、フィールド値を指定するときの方法と同様に、フィールド参照に MU または PE インデックスを指定できます。

注意:

  1. フィールド値の MU-PE インデックスとしての 1-N の使用に適用される上述の規則は、フィールド参照にも適用されます。
  2. LOB フィールドの値が空白の場合、フィールド参照も同様に空白です。

非圧縮レコードのレコード構造の指定例

AA,AB           ; 2 fields specified in the same line	
9X,’LITERAL’    ; Compress: 16 bytes are ignored	
                ; Decompress: "         LITERAL" in decompressed record	
fdt             ; Display FDT before next field is specified	
AT1-12C         ; Number of	values of MU field in the first 12 elements of PE
                ; Only allowed for decompress	
AT1-12(1-2),8,U ; Values of MU field in a PE	
                ; Length is 8 bytes, Format is U	
P1C,P11-N       ; Periodic group count and all groups	
                ; Allowed for compress, too.	
LMR1-4,20       ; File names of files containing values

レコード定義例

このセクションでは、レコード定義の例を示します。ここで記述する例はすべて、『Adabas コマンドリファレンスマニュアル』の「付録 A」のサンプル Adabas ファイルを転載したものです。

例 1:エレメンタリフィールドの定義(標準長および標準フォーマット)

Syntax        : AA,5X,AB.

Record        : AA value(8 bytes alphanumeric)
                5 spaces
                AB value(2 bytes packed)

例 2:エレメンタリフィールドの定義(長さとフォーマットを上書き)

Syntax        :  AA,5X,AB,3,U.

Record        :  AA value (8 bytes alphanumeric)
                 5 spaces
                 AB value (3 bytes unpacked)

例 3:ピリオディックグループの処理

Syntax        : GB1.
    
Record        : BA1 value (1 byte binary)
                BB1 value (5 bytes packed)
                BC1 value (10 bytes alphanumeric)

例 4:ピリオディックグループ GB の最初から 2 つのオカレンスを処理

Syntax        : GB1-2.
Record        : BA1 value (1 byte binary)
                BB1 value (5 bytes packed)        GB1
                BC1 value (10 bytes alphanumeric)
                BA2 value (1 byte binary)
                BB2 value (5 bytes packed)        GB2
                BC2 value (10 bytes alphanumeric)

例 5:マルチプルバリューフィールド MF の 6 番目の値を処理

Syntax        : MF6.

Record        : MF value 6 (3 bytes alphanumeric)

例 6:マルチプルバリューフィールド MF の最初から 2 つの値を処理

Syntax        : MF01-02.

Record        : MF value 1 (3 bytes alphanumeric)
                MF value 2 (3 bytes alphanumeric)

例 7:ピリオディックグループ GC の最高オカレンス番号と、
マルチプルバリューフィールド MF に存在する値の数を処理

Syntax        : GCC,MFC.
    
Record        : Highest occurrence count for GC (1 byte binary)
                Value count for MF (1 byte binary)

出力レコード

ユーティリティ ADADCU は、要求されたフィールド値をレコード定義構文で指定された順に返します。長さまたはフォーマットのいずれか、または両方が指定されていない場合、値はフィールドに定義された標準長とフォーマットで返されます。値が空値である場合は、フィールドのフォーマットに応じて次のように返されます。

フォーマット 空値
英数字(A) 空白(ASCII の場合は 16 進 '20'、EBCDIC の場合 16 進 '40')
2 進数(B) バイナリのゼロ
固定小数点(F) バイナリのゼロ
浮動小数点(G) バイナリのゼロ
パック 10 進数(P) パック 10 進数の 0
アンパック 10 進数(U) アンパック 10 進数の 0(ターゲットのアーキテクチャにより異なる)
Unicode(W) WCHARSET に指定した空白

注意:
パック 10 進数では、C は符号として使用されます。アンパック 10 進数では、ターゲットアーキテクチャが ASCII の場合は 3 が、ターゲットアーキテクチャが EBCDIC の場合は F が符号として使用されます。

Adabas は、要求されたすべてのフィールドの合計長(標準長または指定された長さ)に等しいバイト数を返します。

ADACMP の入力データ要件

ユーザーデータが ADACMP への入力になる場合、そのデータはシーケンシャルファイルのデータであることが前提条件になります。各レコードのフィールドの構造は、設定済みのフィールド定義テーブル、またはファイルのフィールドのサブセットのどちらかに合わせます。

ユーザーデータが ADACMP への入力になる場合、そのデータはシーケンシャルファイルのデータであることが前提条件になります。4 つの方法で入力ファイルのレコードを区切ることができます。詳細については、『ユーティリティマニュアル』の「ADACMP」のパラメータ RECORD_STRUCTURE を参照してください。各レコードのフィールドは、設定済みのデータ定義ステートメントに従って構成する必要があります。

ユーザー出口ルーチンを使用する場合は、ユーザー出口処理後に、構造とデータ定義との間に不整合が発生しないようにする必要があります。対応するデータ定義ステートメントがない入力レコードがあると、それ以降の情報は処理されなくなり、ADACMP の出力結果からも除外されます。

UNPACKED と定義されたフィールドは、下位バイトの上位 4 ビットに有効な符号値を持っていなければなりません。符号はゾーン付き数値形式でなければなりません。Adabas は符号をゾーン形式で表現します。

PACKED と定義されたフィールドは、下位バイトの下位 4 ビットに有効な符号値を持っていなければなりません。有効な正の符号は A、C、E および F です。有効な負の符号は B および D です。Adabas は、正の値を C、負の値を D で表現します。

オーバーパンチ形式もサポートされています。詳細については、『VAX-11 Architecture Handbook』の「Data Representation」を参照してください。

入力ファイルにレコードがないと、警告メッセージが表示され、ユーティリティは異常終了します。しかし、FDT 情報を持つ CMPDTA 出力ファイルは作成されます。

マルチプルバリューフィールドカウント

非圧縮レコードの構造を FIELDS パラメータ以外の方法で記述する場合は、これから説明する点に注意してください。

マルチプルバリューフィールドの値の先頭には、レコード内にあるマルチプルバリューフィールドの値の数を示すために、ADACMP パラメータ MUPE_C_L の設定に応じた、1、2、または 4 バイトのバイナリカウントがなければなりません。指定できる値の最小数は 1 です。

値の数がどのレコードでも一定であれば、マルチプルバリューフィールドの定義に使用するフィールド定義テーブルにその数を指定することができます。この場合、入力レコード中にはカウントバイトを付けません。このオプションは、FDT キーワードを使用する場合だけ可能です。データベースから読み込まれる FDT のデフォルトのオカレンスカウントは、常に可変になります。このような可変のオカレンスカウントは、FIELDS キーワードを使用すれば値を変更できます。

ピリオディックグループ内のマルチプルフィールドは、ピリオディックグループのオカレンスカウントの指定が可変になっている場合には、オカレンスカウントを指定してはいけません。

例:

        01,PG,PE
         02,P1,4,A,NU
         02,PM,4,A,NU,MU(4)
                         ^
%ADACMP-E-FIXOCC, specification of occurrences not allowed at this position

ユーザーが指定するカウントは、そのフィールドに NU オプションが定義されていれば ADACMP で修正できます。空値は省略され、カウントフィールドはそれに従って修正されます。

例:

Field Definition:  01,MF,4,A,MU,NU

各レコードの MF 値の数が可変です。

Input Records       Before ADACMP          After ADACMP
Input Record 1
(3 values)          MF count = 3           MF count = 3
                    AAAA                   AAAA
                    BBBB                   BBBB
                    CCCC                   CCCC
Input Record 3
(3 values)          MF count = 3           MF count = 2
                    AAAA                   AAAA
                    <null value>           CCCC
                    CCCC
Input Record 4
(1 value)           MF count = 1           MF count = 0
                    <null value>

例:

Field Definition:  01,MF,4,A,MU(3),NU

各レコードの MF 値の数が 3 です。

Input Records       Before ADACMP          After ADACMP
Input Record 1                             MF count = 3
                    AAAA                   AAAA
                    BBBB                   BBBB
                    CCCC                   CCCC
Input Record 2                             MF count = 2
                    AAAA                   AAAA
                    BBBB                   BBBB
                    <null value>
Input Record 3                             MF count = 2
                    AAAA                   AAAA
                    <null value>           CCCC
                    CCCC
Input Record 4                             MF count = 0
                    <null value>
                    <null value>
                    <null value>

ピリオディックグループカウント

非圧縮レコードの構造を FIELDS パラメータ以外の方法で記述する場合は、これから説明する点に注意してください。

ピリオディックグループの最初のオカレンスの先頭には、レコードのピリオディックグループのオカレンス数を示す、1、2、または 4 バイト(ADACMP パラメータ MUPE_C_L の設定に依存する)のバイナリカウントがなければなりません。指定できるオカレンスの最小数は 1 です。

オカレンス数がどのレコードでも一定であれば、ピリオディックグループの定義に使用するフィールド定義テーブルにその数を指定することができます。この場合、入力レコード中にはカウントバイトを付けません。

このオプションは、FDT キーワードを使用する場合だけ可能です。データベースから読み込まれる FDT のデフォルトのオカレンスカウントは、常に可変になります。このような可変のオカレンスカウントは、FIELD キーワードを使用すれば値を変更できます。

設定済みのオカレンスカウントは、ピリオディックグループ内のすべてのフィールドが NU オプションで定義されている場合のみに、ADACMP で修正できます。あるオカレンスのすべてのフィールドが空値を持ち、空でない値を持つ後続のオカレンスがなければ、そのオカレンスは省略され、ピリオディックグループのオカレンスカウントはそれに従って修正されます。

例(NU オプションを指定した PE)

Field Definitions:   01,GA,PE
                          02,A1,4,A,NU
                          02,A2,4,A,NU

入力レコードには GA に対する可変数のオカレンスが含まれています。

Input Records       Before ADACMP          After ADACMP
Input Record 1      GA count = 2           GA count = 2
                    GA (1st occ.)
                     A1 = AAAA              A1 = AAAA
                     A2 = BBBB              A2 = BBBB
                    GA (2nd occ.)
                     A1 = CCCC              A1 = CCCC
                     A2 = DDDD              A2 = DDDD
Input Record 2      GA count = 1           GA count = 0
                    GA (1st occ.)
                     A1 = <null value>     suppressed *
                     A2 = <null value>     suppressed *
Input Record 3      GA count = 3           GA count = 3
                    GA (1st occ.)
                     A1 = AAAA              A1 = AAAA
                     A2 = <null value>      A2 = suppressed
                    GA (2nd occ.)
                     A1 = BBBB              A1 = BBBB
                     A2 = <null value>      A2 = suppressed
                    GA (3rd occ.)
                     A1 = CCCC              A1 = CCCC
                     A2 = <null value>      A2 = suppressed

* これは 2 という値を持つ空フィールドカウントによって示されます。63 までの連続する空フィールドが、1 つの空フィールドカウントによって示されます。

例(NU オプションを指定した PE)

Field Definitions:   01,GA,PE(3)
                           02,A1,4,A,NU
                           02,A2,4,A,NU

入力レコードの GA のオカレンスの数はどれも 3 つです。

Input Records       Before ADACMP          After ADACMP
Input Record 1
                    GA (1st occ.)          GA count = 3
                     A1 = AAAA              A1 = AAAA
                     A2 = <null value>      A2 suppressed
                    GA (2nd occ.)
                     A1 = BBBB              A1 = BBBB
                     A2 = <null value>      A2 suppressed
                    GA (3rd occ.)
                     A1 = CCCC              A1 = CCCC
                     A2 = <null value>      A2 suppressed
Input Record 2                             GA count = 2*
                    GA (1st occ.)
                     A1 = <null value>      A1 = suppressed
                     A2 = <null value>      A2 = suppressed
                    GA (2nd occ.)
                     A1 = BBBB              A1 = BBBB
                     A2 = <null value>      A2 = suppressed
                    GA (3rd occ.)
                     A1 = <null value>      A1 = suppressed
                     A2 = <null value>      A2 = suppressed
Input Record 3      All occ.               GA count = 0
                    contain                All occurrences
                    null value             are suppressed **

* 空でない値を持つオカレンスが後に続くので、最初のオカレンスはカウントに含まれます。3 番目のオカレンスは、空でない値を持つオカレンスが後に続かないのでカウントには含まれません。

** これは 2 という値を持つ空フィールドカウントによって示されます。

例(NU オプションの指定がない PE)

Field Definitions:   01,GA,PE(3)
                           02,A1,4,A
                           02,A2,4,A

入力レコードの GA のオカレンスの数はどれも 3 つです。

Input Records       Before ADACMP         After ADACMP
Input Record 1      GA (1st occ.)         GA count = 3
                     A1 = <null value>     A1 = <null value>
                     A2 = <null value>     A2 = <null value>
                    GA (2nd occ.)
                     A1 = <null value>     A1 = <null value>
                     A2 = <null value>     A2 = <null value>
                    GA (3rd occ.)
                     A1 = CCCC             A1 = CCCC
                     A2 = <null value>     A2 = <null value>
Input Record 2                            GA count = 3
                    GA (1st occ.)
                     A1 = <null value>     A1 = <null value>
                     A2 = AAAA             A2 = AAAA
                    GA (2nd occ.)
                     A1 = <null value>     A1 = <null value>
                     A2 = <null value>     A2 = <null value>
                    GA (3rd occ.)
                     A1 = <null value>     A1 = <null value>
                     A2 = <null value>     A2 = <null value>

可変長の場合の長さインジケータ

可変長フィールド(フィールド定義に長さが 0 で指定されている)の各値の先頭には、(長さインジケータを含めた)値の長さを示す長さインジケータ(バイナリ形式)がなければなりません。

長さインジケータの長さは次のようになります。

  • 4 バイト(L4 オプションを持つフィールドの場合)

  • 2 バイト(LA オプションを持つフィールドの場合)

  • 1 バイト(どちらのオプションも持たないフィールドの場合)

例:

Field Definitions:
    
     01,AA,8,A,DE
     01,V1,0,A
     01,V2,0,A,LA
     01,V4,0,A,L4

入力レコード(上位優先)

"FIELD AA\x09FIELD V1\x00\x0aFIELD V2\x00\x00\x00\x0cFIELD V4"

"FIELD AA\x09FIELD V1\x07\xD2 (2000 data bytes)\x00\x00\x07\xD2 (2000 data bytes)"

入力レコード(下位優先)

"FIELD AA\x09FIELD V1\x0a\x00FIELD V2\x0c\x00\x00\x00FIELD V4"

"FIELD AA\x09FIELD V1\xD2\x07 (2000 data bytes)\xD2\x07\x00\x00 (2000 data bytes)"

NC オプションのインジケータ

入力レコードの構造の規定に FDT を使用する場合、NC オプション付きのフィールドの値は、インジケータなしで定義します。

例:

Field Definitions:
     
     01,AA,5,A,NC
     01,AB,5,A,NC

Input Record

Field AA     Field AB

(5 bytes)    (5 bytes)

入力レコードの値が NC オプション付きの値に相当する場合、NULL_VALUE パラメータを設定するか、または FILEDS パラメータを使ってレコードの構造を規定しなければなりません。

ADACMP の処理に関する考慮

データ変更

ADACMP は、すべての入力レコードを次のように変更します。

フォーマット U または P で定義されたフィールドは、そのフィールド値が数値であり、正しいフォーマットであるかどうかがチェックされます。

値が空の場合は、フィールドに指定したフォーマットに対応する文字を持っていなければいけません。

フォーマット 空値
英数字(A) 空白(ASCII の場合は 16 進 '20'、EBCDIC の場合 16 進 '40')
2 進数(B) バイナリのゼロ
固定小数点(F) バイナリのゼロ
浮動小数点(G) バイナリのゼロ
パック 10 進数(P) パック 10 進数の 0
アンパック 10 進数(U) アンパック 10 進数の 0(ソースのアーキテクチャにより異なる)
Unicode(W) WCHARSET に指定した空白

パックまたはアンパックの英数字フィールドの場合には、-0 は +0 に変換されます。

不当なデータを持つすべてのレコードは、ADACMP エラーファイルに書き込まれ、圧縮ファイルには書き込まれません。

データ圧縮

各フィールドの値は(FI オプションの指定がない限り)次のように圧縮されます。

  • A フォーマットで定義されたフィールドの末尾の空白は削除されます。

  • B、P または U フォーマットで定義されたフィールドの場合、先頭のゼロは除去されます。

  • フィールドが NU オプションを指定して定義され、かつ値が空値である場合は、1 バイトのインジケータが格納されます。16 進 'C1' は 1 つの空フィールドが続くことを示し、'C2' は 2 つの空フィールドが続くことを示します。以下同様です。

  • レコードの最後に位置する空フィールドは、格納されません。

例:

次のデータ定義と対応する値は、ADACMP によって図に示すように処理されます。

01,ID,4,B,DE      ; ID
01,BD,6,U,DE,NU   ; BIRTHDATE
01,SA,5,P         ; SALARY
01,DI,2,P,NU      ; DAYS ILL
01,FN,8,A,NU      ; FIRST_NAME
01,LN,9,A,NU      ; LAST_NAME
01,SE,1,A,FI      ; SEX
01,HO,7,A,NU      ; HOBBY
Field    Format  Before compression          After compression

ID         B     67 12 00 00                 03  67 12

BD         U     31 36 30 35 35 39           07  31 36 30 35 35 39

SA         P     00 00 05 00 0C              04  05 00 0C

DI         P     00 0C                      )                       
                                            )C2 (two empty fields)
FN         A     20 20 20 20 20 20 20 20    )    

LN         A     4E 41 4D 45 20 20 20 20 20  05  4E 41 4D 45

SE         A     4D                          4D

HO         A     20 20 20 20 20 20 20        C1 (one empty field)

ADAMUP の処理に関する考慮

Adabas データベースファイルのレコード追加または削除時は、アドレスコンバータ(AC)、データストレージ(DS)およびインデックスに、エントリの挿入/削除が必要になります。データストレージスペーステーブル(DSST)は、それにしたがって修正される必要があります。

レコードの追加

ISN の割り当て

USERISN オプションを設定すると、入力データを特定する ISN が使用されます。この ISN がファイルに対する現在の制限(MAXISN)を超える場合、または同じ ISN がすでに別のレコードに割り当てられている場合は、ADAMUP は実行を終了してエラーメッセージを返します。Adabas N2 コマンドを使用したときと同じように、ファイルのアドレスコンバータの自動拡張はありません。ファイルの最初の空き ISN は、ファイルの現在の最初の空き ISN より大きいか等しい USERISN があれば、設定済みの最高 USERISN より 1 大きい値に設定されます。

USERISN オプションが省略されるか、NOUSERISN が指定されると、各レコードの ISN は ADAMUP によって割り当てられます。ISN は昇順に割り当てられます。ISN 再使用が有効な場合は、ADAMUP は未使用の ISN があるかファイルのアドレスコンバータを探します。すべての ISN が再使用されているか、ISN 再使用が無効な場合は、ADAMUP はファイルの最初の空き ISN で始まる新しい ISN を割り当てます。新しいアドレスコンバータブロックが必要になると、現在使用可能なエクステントから割り当てられます。これらのブロックを使いつくすと、この章で説明しているルールに従って、自動拡張が実行されます。エクステントが割り当てられた場合には、処理は続行しますが、割り当てられなかった場合には、ADAMUP がエラーメッセージを出力して終了します。

並行に動作している大量削除によって削除される ISN は、追加されるレコードに対して直ちに再使用できます。

データストレージ内のスペースの発見

DS 再使用が有効になっている場合、ADAMUP は、現在のデータレコードの格納に十分なスペースを持つ DS RABN があるか DSST 内を探します。Adabas ニュークリアスが行うのと全く同じように、1 回につき 1 つずつ DSST RABN が調べられ、DSST にスペースが見つからなければ、最初の空き DS RABN が使用されます。大量削除が並行に実行されている場合は、レコードが削除された DS RABN が最初に再使用されます。これは、Adabas ニュークリアスの場合の手順とは異なりますが、DSST 内の検索を省き、データストレージへの入出力回数を最小化しています。こうするのは、いずれの場合にも削除ルーチンがこのような RABN を読み取り、書き込む必要があるからです。

DS 再使用が無効な場合、または DSST にスペースが見つからない場合、ADAMUP は最初の空き DS RABN で始まる新しい DS ブロックを割り当てます。

新しいレコードがデータストレージブロックに追加される場合は、ファイルに対して指定されているパディングファクタが考慮されます。新しいデータストレージブロックが必要な場合は、現在使用可能なエクステントから割り当てられます。これらのブロックを使いつくすと、自動拡張が実行されます。エクステントが割り当てられた場合には、処理は続行しますが、割り当てられなかった場合には、ADAMUP がエラーメッセージを出力して終了します。

レコードの削除

最初のステップで、削除対象の ISN を含むファイルの入力レコードがすべて読み込まれ、検証されます。正しくないレコードが発見されると、行番号とオフセットが表示され、入力ファイルの解析が完了すると、ADAMUP は実行を終了してエラーステータスを返します。

このステップの最後に、ADAMUP は削除対象の ISN のテーブルを仮想メモリ上に作成します。このテーブルは、ファイルのアドレスコンバータ、データストレージおよびインデックスに対して、必要な更新を行う次のステップで使用されます。このテーブルに必要なスペース(エントリごとに 1 ビット)は、入力ファイルに指定された最小および最大 ISN に依存します。十分なスペースがなければ、ADAMUP は実行を終了してエラーメッセージを返します。

2 番目のステップでは、ファイルのアドレスコンバータが処理されます。削除対象の ISN はあらかじめソートされているため、このステップのアドレスコンバータの入出力回数は最小限に抑えられます。

指定された各 ISN に対応するアドレスコンバータのエントリが検索されます。未使用の ISN については、NOT_PRESENT=IGNORE が指定されていれば(デフォルト)、エントリはエラーログに書き込まれ、処理は続行します。指定されていなければ、ADAMUP は終了してエラーメッセージが返されます。使用されている ISN については、対応するデータストレージ RABN が SORT に入れられ、アドレスコンバータのエントリが削除されます。同じデータストレージ RABN への連続する参照はスキップされます。ファイルコントロールブロック(FCB)での位置がわかるように、SORT に入れられた各データストレージ RABN の前にはエクステント番号が先頭に付けられます。こうすることによって、次のステップでは、データストレージのエクステントが割り当てられた順番に従って、ファイルのデータストレージを処理できます。

このステップの最後で、ファイルの最初の空き ISN は、ISN の再使用が有効であれば、削除対象の ISN の最大範囲の最初の ISN に再設定され、削除対象レコードの範囲の最大 ISN は、ファイル上の最後に使用された ISN と同一になります。

3 番目のステップでは、ファイルのデータストレージとデータストレージスペーステーブルが処理されます。変更対象のデータストレージ RABN はその時点でソート済みなので、このステップではデータストレージとデータストレージスペーステーブルの入出力回数は最小限に抑えられます。

関連するデータストレージブロックが、SORT によって返される値を使用して読み込まれます。各ブロック内で、削除対象の ISN のテーブル内にある ISN と一致するレコードは削除され、(大量追加が同時に実行され、DS 再使用が有効な場合は)ブロックは追加対象のレコードの割り当てに再使用され、データストレージスペーステーブルがそれにしたがって変更されます。このステップの最後で、最初の空きデータストレージ RABN は、DS 再使用が有効であれば、すべてのデータが削除されたデータストレージ RABN の最終範囲の開始 RABN に再設定され、最終 RABN はファイル上の最後に使用されたデータストレージ RABN と同一になります。

インデックスの更新

アドレスコンバータ、データストレージおよびデータストレージスペーステーブルが変更されると、ADAMUP はファイルのノーマルインデックス(NI)を中間ファイルにコピーし、ファイルのインデックスエクステントをリセットします。削除レコードに対応するインデックスエントリは、このステップで省略されます。

ノーマルインデックスとメインインデックスのロード

ノーマルインデックスとメインインデックスを構築するため、入力ファイルに含まれるディスクリプタバリューテーブル(DVT)エントリを読み取り、昇順のディスクリプタ値と ISN に従ってソートする必要があります。このソートの出力は、中間ファイルに保存されたノーマルインデックスエントリとマージされ、後で新しいノーマルインデックスとメインインデックスの構築に使用されます。

ユニークオプションで定義されたディスクリプタは、新しいノーマルインデックスがディスクリプタ値ごとに 1 つのみの ISN を持っているかどうかがチェックされます。複数の ISN があると、矛盾する ISN はエラーログに書き込まれ、UQ_CONFLICT=RESET が指定されていると、FDT のユニークフラグがリセットされて処理は続行します。指定されていなければ、ADAMUP はエラーメッセージを表示して終了します。

ディスクリプタ値のソートに加えて、ディスクリプタバリューテーブルの読み込みは、シーケンシャル入力ファイルへの大量の入出力の結果として非常に時間を要します。そのため、大量のディスクリプタがある場合は、ADAMUP は、ディスクリプタスペースサマリ(DSS)に含まれている情報を利用することによって、ディスクリプタバリューテーブルを介した読み込みの回数の最小化を試みます。ディスクリプタバリューテーブルを毎回、読み込むごとに、ディスクリプタの値が 1 つずつ、直接 SORT に渡されます。追加ディスクリプタがある場合は、それらは TEMP データセットに書き込まれます。各読み込みの間に並行して TEMP を使用するディスクリプタの数が多くなるほど、このステップも速くなります。ADAMUP は実行の最後で、必要となった読み込みの合計数を表示します。

ファイルのロード時に指定したパディングファクタに従って、すべてのインデックスブロックに値が設定されます。新しいインデックスブロックは必要に応じて、(このステップの開始時にリセットされている)既存のエクステントから割り当てられます。これらのブロックを使いつくすと、自動拡張が実行されます。エクステントが割り当てられた場合には、処理は続行しますが、割り当てられなかった場合には、ADAMUP がエラーメッセージを出力して終了します。

アッパーインデックスのロード

ノーマルインデックスとメインインデックスがディスクリプタ単位に構成されるのに対し、インデックスレベル 3 以上であるアッパーインデックスは、すべてのディスクリプタを含みます。新しいメインインデックスにリンクするため、新しいメインインデックスブロックごとに、1 エントリがアッパーインデックスに作成されます。この時アッパーインデックス全体が再構築され、ファイルのロード時に指定したパディングファクタに従って、再度、値が設定されます。あらかじめ割り当てられているすべてのブロックは、追加ブロックが割り当てられる前に使用されます。追加ブロックが必要になると、ノーマルインデックスとメインインデックスのロードについて説明したのと同じ手順が使用されます。

エラーデータ

すべてのエラーデータは ADAMUP エラーファイルに書き込まれます。このエラーファイルの内容は、ADAERR ユーティリティを使用して表示します。レコードの中に印刷できない文字が含まれているため、オペレーティングシステム標準の印刷ユーティリティでエラーファイルを印刷しないでください。

詳細については、『ユーティリティマニュアル』の「ADAERR」を参照してください。

ADABCK の処理に関する考慮

DUMP/EXU_DUMP 機能

データベース全体のダンプ時(DUMP=*)は、データベースのグローバル情報とロードされている全ファイルが Adabas バックアップコピーにダンプされます。したがって、データベースをデータベースバックアップコピーからリストアできます。そのような Adabas バックアップコピーに含まれている単一ファイルのリストアもできます。

選択ファイルのみのダンプ機能は、データベース全体のバックアップが不必要な場合に、データベースの一定部分のバックアップを制御可能とします。

DUMP/EXU_DUMP 機能は、ニュークリアスがアクティブでも非アクティブのときにでも使用できます。DUMP 機能の実行中にニュークリアスがアクティブの場合は、すべての更新がバックアップコピーにダンプされます。

AUTORESTART が保留になっているときに、DUMP/EXU_DUMP 機能は使用できません。このため、まずニュークリアスを起動して AUTORESTART の保留状態を解消しなければなりません。

DUMP 機能の終了直前には、すべてのトランザクションを ET ステータスに同期する必要があります。アクティブなニュークリアスは ADABCK の要求時にこれを自動的に行います。同期の間、ニュークリアスは次のコマンドだけをスケジュールします。

  • ET ユーザーが ET ステータスに達することができるようにするコマンド

  • すべてのアクティブな更新コマンドを完了させるコマンド

  • 読み取り/検索コマンド

DUMP/EXU_DUMP の実行中にニュークリアスが異常終了した場合、ニュークリアスの起動を要求するメッセージがデータベースのオペレータに送信されます。

DUMP 機能が実行しているときニュークリアスを起動することができます。この場合、ニュークリアスと DUMP 機能は相互に同期をとります。DUMP 機能が稼動しているとき、ニュークリアスは ADAOPR CANCEL でシャットダウンすることができます。ニュークリアスが異常終了すると、ADABCK はニュークリアス開始要求のメッセージを表示します。正常終了した後、ニュークリアスが自動再スタートを実行するまで待機状態になります。

並行バックアップ

複数の ADABCK ジョブを使用して、単一ファイルを並行してダンプすると便利なこともあります。これは、EXU_DUMP で一般的に有効ですが、ニュークリアスが稼動しているときは、1 つの DUMP 機能だけが実行できます。

注意:
並行バックアップは、Windows 環境で使用できません。

RESTORE/OVERLAY 機能

バックアップコピーは、単一ファイル、またはデータベースのグローバル情報が破壊されている場合に、指定ファイルまたはデータベースのリストア/オーバーレイに使用できます。

ADABCK DUMP=* により作成されたバックアップコピーを使用して、データベース全体をリストアできます。

ADABCK DUMP=(2, 5-8, 100-130) のように、ADABCK DUMP=(ファイルの列挙) という形式でバックアップコピーを作成すると、指定に従ってデータベースから抽出されたファイルだけがバックアップコピーとして作成されます。この種のバックアップは、通常、指定したファイルのリストアが必要な場合に使用します。また、この種のバックアップを使用して、ADABCK RESTORE=* または ADABCK OVERLAY=* でデータベース全体のリストアまたはオーバーレイを実行することもできます。ただし、これを実行した場合、ADABCK DUMP コマンドによってバックアップされたファイルのみがデータベースにリストアされ、その他すべてのファイルは削除されます。この場合、ADABCK は、リストア処理の結果、データベース内のファイル数合計が変化したことを示すメッセージ GCBAFL を出力します。

ファイルのリストアとオーバーレイは、ニュークリアスがアクティブかどうかに関係なく実行できます。リストア/オーバーレイ対象のファイルによって要求されるすべての RABN がチェックされます。すべての RABN が使用可能な場合、そのファイルは以前と同じ場所に置かれます。データベース内の要求した RABN のうち、1 つでも使用不可能なものがあれば、完全に新しい RABN の組み合わせが割り当てられます。

ファイルのリストアとオーバーレイは、ニュークリアスがアクティブかどうかに関係なく実行できます。リストア/オーバーレイの対象ファイルに必要な RABN が存在している必要があります。

データベースのリストア/オーバーレイ時は、ニュークリアスはアクティブであってはいけません。それは、データベースコンテナファイルの排他制御が必要であるからです。

データベース全体のリストア/オーバーレイ時は、元のデータベースの方が大きいことがあります。これは、基準データベースがバックアップセーブセットよりも多くのブロック数またはコンテナ数を含むためですが、セーブセットで扱うブロックサイズは同一でなければなりません。基準データベースの未使用ブロックは保持され、そのスペースはフリースペーステーブルに戻されます。

ファイルをリストア/オーバーレイするとき、基準データベースはバックアップコピーより小さくしたり、または大きくしたりすることができます。

ファイルをリストア/オーバーレイするとき、ADABCK はデフォルトで元のブロック番号にブロックをリストアしようとします。このスペースが他のファイルに使用されているために利用できない場合、ファイルは完全に他のブロック番号にリストアされ、複数のファイルエクステントを 1 エクステントに結合しようとします。

並行リストア

複数の ADABCK ジョブを使用して、単一ファイルを並行してリストアすると便利なこともあります。これは、ニュークリアスが稼動しているかどうかに関係なく、RESTORE および OVERLAY 機能の両方で有効です。

セキュリティファイルの考慮

セキュリティファイルのリストア/オーバーレイ時は、パスワードおよび関連パーミッションレベルのみが再設定され、ロードされるファイルの保護レベルは再設定されません。したがって、新たにフォーマット化されたデータベースにファイルをリストアする場合は、ADASCR セキュリティユーティリティを使用して保護レベルを再度使用可能にしなければなりません。

データベースをリストア/オーバーレイすると、全ファイルの保護レベルの再設定のみが行われます。

ADABCK の再スタートに関する考慮

ADABCK には再スタート機能は備えられていません。ADABCK が異常終了した場合、最初から再実行する必要があります。

1 つ以上のファイルに対して RESTORE/OVERLAY 機能を実行しているときに処理が中断されると、RABN の割り当ては不完全になりますが、ADADBM ユーティリティの RECOVER 機能を実行すれば完全な状態に戻すことができます。データベースに対して RESTORE/OVERLAY 機能を実行しているときに処理が中断されると、そのデータベースにはアクセスできなくなります。

ADAORD の処理に関する考慮

ファイルのエクスポート

1 つ以上のファイルをエクスポートするとき、ADAORD は各ファイルのデータストレージの内容を、そのインデックスを再構築するのに必要な情報と一緒にシーケンシャル出力ファイル(ORDEXP)にコピーします。ファイルのデータレコードのエクスポートは、アンロードと同じで、ADAORD は ADAULD ユーティリティと同様の処理順序をサポートします。しかし、ファイルのインデックスを再構築するのに必要な情報が提供される方法が異なります。ADAORD は、(ADAULD のように)データレコードに基づいたディスクリプタバリューテーブル(DVT)エントリを生成しませんが、ファイルのインバーテッドリストを回復し、エクスポートします。ADAORD は、有効なインデックスにアクセスする必要があるので、I/O 数が増える結果となりますが、一方で CPU 時間を節約できます。

処理対象のファイルすべては、ファイル番号の小さい方から順番に単一シーケンシャル出力ファイル(ORDEXP)に書き出されます。後でファイルを再度インポートするときに、デフォルト値でない割り当て量または配置を使用したいのであれば、エクスポートを複数回の実行に分けて、シーケンシャル出力ファイルを複数作成することも考えられます。デフォルト以外の値や配置を使用する場合、各ファイルは別々に実行する必要があるため、エクスポートの手順を分けると、再度インポートするときに長く時間のかかる位置づけをしなくても済みます。

ファイルのインポート

1 つ以上のファイルをインポートするとき、各ファイルのデータストレージ、アドレスコンバータおよびインデックスを再構築するために、ADAORD は、シーケンシャル入力ファイル(ORDEXP)に含まれる情報を検索します。ファイルのデータレコードをインポートし、アドレスコンバータを構築することは、(USERISN オプション付き)ADAMUP ユーティリティを使用してそれらをロードすることと同じです。しかし、ディスクリプタ値と ISN は正しい順序で提供されるため、ファイルのインデックスを構築する処理は ADAORD の方が速くなります。このため、ソートを実行(SORT ファイルおよび TEMP ファイルを使用)する必要がなくなり、EXPORT 段階でのインデックスの読み込みにかかる時間を十分に相殺できます。

シーケンシャル入力ファイル(ORDEXP)のフォーマットは、データベースのデバイスタイプとは無関係です。このため、エクスポートとその後のインポートの処理を使用して、異なるデバイスタイプに存在するデータベース間でファイルを移動できます。

セキュリティファイルをインポートするとき、パスワードと関連する許可レベルだけが再構築されます。インポートされたファイルの保護レベルは再構築されません。このため、新規にフォーマットされたデータベースにファイルをインポートする場合、ADASCR ユーティリティを使用して保護レベルを再度有効にする必要があります(詳細については、『ユーティリティマニュアル』を参照)。

セキュリティファイルをインポートするとき、パスワードと関連する許可レベルだけが再構築されます。インポートされるファイルがデータベース内でセキュリティ保護されていない場合、バックアップコピーに保存されている保護レベルがリストアされます。

スペースの割り当て

ファイルをインポートするとき、その配置および初期割り当て量はユーザーが制御することも、ADAORD に制御を任せることもできます。

開始 RABN または KEEP_LAYOUT オプションを指定して強制的に位置指定しない限り、ADAORD は、次の順序でファイルのエクステントの初期割り当てを行います。アドレスコンバータ(AC)、アッパーインデックス(UI)、ノーマルインデックス(NI)、およびデータストレージ(DS)。

開始 RABN を指定して強制的に位置指定しない限り、ADAORD は、次の順序でファイルのエクステントの初期割り当てを行います。アドレスコンバータ(AC)、アッパーインデックス(UI)、ノーマルインデックス(NI)、およびデータストレージ(DS)。

これにより、使い尽くす可能性の最も高い 2 つのエクステントタイプ(NI と DS)が他のエクステントに割り込まずに拡張できます。

割り当てられるブロックまたはシリンダの数が省略され、KEEP_LAYOUT オプションが指定されていない場合、ADAORD は次のように割り当て量を計算します。

ALQN = ALQO * (1 + (PFACN - PFACO) / 100)

上記式内の各項目の意味は次のとおりです。

ALQN 新しく割り当てられるブロック数
ALQO 今まで割り当てられていたブロック数
PFACN 新しく使用されるパディングファクタ
PFACO 今まで使用されてきたパディングファクタ

デフォルトでは、最初から最後まで一貫して、できるだけ物理的に連続した領域に割り当てようとする方式が適用されます。CONTIGUOUS パラメータを指定すると、指定した各タイプの最初の論理エクステントのみが使用されます。ただし、連続したスペースが十分に取れないと、ADAORD が異常終了する可能性があります。

割り当てるブロック数またはメガバイト数を指定しないと、ADAORD は次のように割り当て量を計算します。

ALQN = ALQO * (100 - PFACO) / (100 - PFACN)

上記式内の各項目の意味は次のとおりです。

ALQN 新しい割り当て量(ブロック単位またはメガバイト)
ALQO 今までの割り当て量(ブロック単位またはメガバイト)
PFACN 新しく使用されるパディングファクタ
PFACO 今まで使用されてきたパディングファクタ

デフォルトでは、最初から最後まで一貫して、できるだけ物理的に連続した領域に割り当てようとする方式が適用されます。

ISN の割り当て

データレコード単位に設定された(および、インバーテッドリストに含まれる)ISN が使用されます。ファイルの制限値(MAXISN)をファイルの最初の空き ISN 値よりも小さく設定した場合、その新しい制限値を超える ISN があると、ADAORD は実行を終了し、エラーメッセージを返します。ファイルの最初の空き ISN は、データレコード内の最大 ISN よりも 1 大きい値に設定されます。

ISN 割り当てを変更するには、ADAULD を使用して該当ファイルをアンロードし、ADAMUP を使用して再ロードしなければなりません。

データベースの再構築

この処理を行うということは、EXPORT 機能と IMPORT 機能を使用することを意味しています。

データベースレベルで再構築するとき、データベースのすべてのファイルを第 1 段階でエクスポートしなければなりません。単一バージョンの ORDEXP が、物理的に存在する場所とは別に作成されます。

第 2 段階では、データベースの FCB 領域と FDT 領域を再配置し、DSST を再度割り当てます。

最終段階では、ファイルを再インポートします。各ファイルは再配置され、複数の論理エクステントは単一の論理エクステントに凝縮されて、パディングファクタは再設定されます。

作成されたシーケンシャルファイル(ORDEXP)はこの機能終了時に削除されません。

ファイルレベルでリオーダして、ディスクを中間ストレージとして使用するとき、ADAORD は、指定されたファイルの処理前にシーケンシャルファイル ORDEXP を作成し、処理後にシーケンシャルファイル ORDEXP を削除して、一時スペース要件を最小化します。これにより、EXPORT 機能の後に IMPORT 機能を何回も続けることができます。データベース内のファイルの位置が変わらず、ファイルの割り当て領域内のみで上書きが発生するため、これが可能になっています。ただし、NODELETE オプションが指定されているか、ORDEXP がテープ上に存在する場合、データベースレベルでのリオーダで説明したように、ADAORD は単一のファイルを作成し処理します。テープ上では、データベースレベルで処理することにより、複数のバージョンの ORDEXP が存在することによる問題を回避し、テープ処理を効率化します。

一貫性のないインデックスの修復

新しいインデックスは(ファイルのデータレコードではなく)旧インデックスの内容に基づくものであるため、ファイルのエクスポートと再インポートによって、論理的に一貫性のないインデックスを修復することはできません。また、物理的に破壊されたインデックスがあると、ADAORD の EXPORT 機能がループしたり、異常終了したりすることがあります。

インデックスを修復するには、ADAINV を使用して再インバートするか、ADAULD と ADAMUP を使用してファイルをアンロードしてから再ロードします。

ファイルのスペースの見積り

ここでは、ファイルに必要なアソシエータおよびデータストレージのスペース要件を求める計算式について説明します。

最初の見積もりの取得

以降では、データをロードする前にファイルやデータベースに必要なディスクスペースの正確な見積もりを取得するための適切な方法について説明します。最初の概算を取得する単純な方法は少量のデータ(例えば 1~2 %)をデータベースにロードし、ADAREP ユーティリティを実行して、割り当て済みブロックと未使用ブロックとして出力された数字をチェックします。その後、100 %のデータに必要なスペースの大きさを求めるためにこれらの数字を推定します。これは、スペース要件を求めるために熟練したデータベース管理者が使用するアプローチです。

アソシエータのスペースの見積り

ファイルに必要なアソシエータスペースは次のアソシエータエレメントに必要なスペースの合計です。

  1. ノーマルインデックス

    ノーマルインデックスは、インデックス構造の最小レベルです。これはインバーテッドリストを持ちます。各インバーテッドリストは、ディスクリプタ値とこのディスクリプタ値を参照するすべてのレコードの ISN リストから構成されます。

  2. アッパーインデックス

    アッパーインデックスはメインインデックスおよび他のアッパーインデックスレベルで構成されます。メインインデックスはノーマルインデックスの後のインデックス構造の次に高いレベルです。これを使用してノーマルインデックスを管理します。このレベルまでの各インデックスブロックには 1 ディスクリプタだけのエントリが含まれりことがあります。

    アッパーインデックス(インデックスレベル 3 以上)は、存在している全ディスクリプタに対するエントリを持ちます。レベル 3 は、メインインデックスの管理に使用されます。現在のレベルのアッパーインデックスブロックが複数あれば、さらにレベルが追加され、各レベルが下位レベルを管理します。

  3. アドレスコンバータ

    アドレスコンバータは、RABN のテーブルで構成され、それぞれの RABN は、ISN で識別されるレコードがデータストレージ内のどの場所にあるのかを示します。

ノーマルインデックスのスペースの見積り

ノーマルインデックスに必要なスペースは、ファイルにあるディスクリプタの数とその特性によって異なります。

各ディスクリプタに必要なノーマルインデックスの容量は、次の計算式によって求められます。

NIBY = (IL * UV * MAXISN) + DV * (L + 2)

上記式内の各項目の意味は次のとおりです。

NIBY

ノーマルインデックスのスペース要件(バイト単位)です。

UV

各レコードにあるディスクリプタのユニーク値の平均個数です。
ディスクリプタが MU オプションで定義されていない場合、UV は 1 以下です。
ディスクリプタが NU オプション指定で定義されている場合、UV はレコード当たりの値の平均個数から空値を持つレコードの比率を差し引いた値です。例えば、各レコードに存在する値の平均個数が 1 で、値の 20 %が空値の場合、UV は 1 - 0.2 = 0.8 になります。

MAXISN

ファイル内の最大レコード数(ユーティリティ ADAFDU の MAXISN パラメータを参照)です。

DV

ファイル内のディスクリプタの異なる値の個数です。

L

ディスクリプタの値の平均長。FI オプションを指定しないでディスクリプタを定義した場合、L は平均長になります。FI オプションを指定してディスクリプタを定義した場合は、L はディスクリプタの標準長になります。

IL

ISN 自体の長さ。可能な値は 2 バイトまたは 4 バイトです。

IL*UV*MAXISN の項は、ISN を格納するのに必要なスペースを表し、DV*L の項はディスクリプタ値を格納するのに必要なスペースを表しています。

重複値が多いディスクリプタについては、IL*UV*MAXISN の項は重要です。ユニーク値が大きな割合を占めるディスクリプタについては、DV*L の項が重要な要素となります。

一括更新ユーティリティ ADAMUP を使用してデータをロードする場合やインバーテッドリストユーティリティ ADAINV でインデックスを作成する場合に限り有効です。S1 コールを使用してデータをロードするときは、(最悪の場合)2 倍のスペースが必要となり、ブロックの一部が埋まらなくなります。この場合、新しい値をソート順に従ってブロックに追加しなければなりません。ブロック内の空きスペースが足りない場合、インデックスブロックは分割されます。

例 1:バイトの計算

ディスクリプタ AA は、各レコードに平均 1 個の値を持っています。ファイルには、50 個の異なる AA 値が存在します。AA に空値はありません。値の平均長は 3 バイトです。ファイルに設定した MAXISN は 20000 で、ISN サイズは 2 バイトです。

Field Definition: 01,AA,5,U,DE
NI = (2 * 1 * 20,000) + 50*(3 + 2)
NI = 40,000 + 250
NI = 40,250 bytes

例 2:バイトの計算

ディスクリプタ BB は、各レコードに平均 1 個の値を持っています。ファイル内での BB は 20000 個の異なる値をもっています。BB に空値はありません。値の平均長は 10 バイトです。ファイルの MAXISN 設定が 20000、ISN のサイズが 4 バイトだとすると、次のようになります。

Field Definition: 01,BB,15,A,DE
NI = (4 * 1 * 20,000) + 20,000*(10 + 2)
NI = 80,000 + 240,000
NI = 320,000 bytes

例 3:バイトの計算

ディスクリプタ CC は、マルチプルバリューフィールドで各レコードに平均 10 個の値を持っています。ファイルには、およそ 300 個の異なる CC 値が存在します。値の平均長は 4 バイトです。各レコードに平均 3 個の空値が存在します。ファイルの MAXISN 設定が 20000、ISN のサイズが 4 バイトだとすると、次のようになります。

Field Definition: 01,CC,12,A,DE,MU,NU
NI = (4 * 7 * 20,000) + 300*(4 + 2)
NI = 560,000 + 1,800
NI = 561,800 bytes

例 4:バイトの計算

ディスクリプタ DD は、ピリオディックグループ内のフィールドです。各レコードには DD の値が平均で 5 個あります。ファイルには、10 個の異なる DD 値が存在します。各レコードに平均 3 個の空値が存在します。ファイルの MAXISN 設定は 20000 です。値の平均長は 5 バイトで、ISN サイズは 2 バイトです。

Field Definition: 01,PX
                  02,DD,8,A,NU
NI = (2 * 2 * 20,000) + 10*(5 + 2)
NI = 80,000 + 70
NI = 80,070 bytes

ノーマルインデックスに必要なバイト数が決まれば、必要なブロック数は次の計算式で求めることができます。

NIBL = NIBY / (BL * (1 - p / 100) - 3)

上記式内の各項目の意味は次のとおりです。

NIBL

ノーマルインデックスのスペース要件(ブロック数)

NIBY

ノーマルインデックスのスペース要件(バイト)

BL

アソシエータブロック長

p

アソシエータブロックのパディングファクタ

割り算の結果は、整数に切り上げます。

NI requirement in bytes = 60,250
Device type RA92
Associator block padding factor = 10 percent
NIBL = 60,250 / (2044 * (1 - 10 / 100) - 3)
NIBL = 32+ = 33 blocks

例 5:ブロックの計算

NI requirement in bytes = 60,250
Device type 2 KB
Associator block padding factor = 10 percent
NIBL = 60,250 / (2048 * (1 - 10 / 100))
NIBL = 32+ = 33 blocks

アッパーインデックスのスペースの見積り

アッパーインデックスは、メインインデックスおよび他のアッパーインデックスで構成されます。メインインデックスでは、各ノーマルインデックスが 9 バイトの固定部分とディスクリプタ値で構成されます。各ディスクリプタに必要なメインインデックスのスペースは、次の計算式で求めることができます。

MIBY   = NIBL * (L + 9)

上記式内の各項目の意味は次のとおりです。

MIBY

メインインデックスのスペース要件(バイト単位)

NIBL

ノーマルインデックスのスペース要件(ブロック数)

L

ディスクリプタの値の平均長。FI オプションを指定しないでディスクリプタを定義した場合、L は平均長になります。FI オプションを指定してディスクリプタを定義した場合は、L はディスクリプタの標準長になります。A および W フォーマットのフィールドでは、ディスクリプタ値がどの場所で切り捨てられるのかを意識する必要があります。ディスクリプタ値は、前のディスクリプタ値と比べて違っている部分の最初のバイトで切り捨てられます。

例 1:バイトの計算

NI Block Requirement = 45 blocks
MI   = 45 * (3 + 9)
MI   = 540 bytes

次の計算式を使用してメインインデックスの容量をバイト数からブロック数に変換することができます。

MIBL = MIBY / (BL * (1 - P/ 100))

上記式内の各項目の意味は次のとおりです。

MIBL

メインインデックスのスペース要件(ブロック数)

MIBY

メインインデックスのスペース要件(バイト単位)

BL

アソシエータブロック長

p

アソシエータブロックのパディングファクタ

除算の結果は、整数に切り上げられます。

例 2:ブロックの計算

MI byte requirement = 540 bytes
Device type 2 KB
Associator block padding factor = 5 percent
MIBL = 540 / (2048 * (1 - 5 / 100))
MIBL = 0+ = 1 block

スペース全体の要件

最上位のアッパーインデックスレベル(レベル 3 以上)には、ファイルの全ディスクリプタに対するエントリが含まれています。アッパーインデックスに必要なスペース全体は、次の計算式で求めることができます。

UIBL = M * (1 + C + C**2 + C**3 + ... + C**13)

上記式内の各項目の意味は次のとおりです。

UIBL

アッパーインデックスのスペース要件(ブロック)

M

ファイルの全ディスクリプタに必要なメインインデックスのスペースの合計

C は次の計算式で求められます。

C = (L + 13) / (BL * (1 - P/100))

上記式内の各項目の意味は次のとおりです。

L

ファイルの全ディスクリプタのすべての値の平均長

BL

アソシエータブロック長

p

アソシエータブロックのパディングファクタ

アドレスコンバータのスペースの見積り

ファイルのアドレスコンバータは、相対 Adabas ブロック番号(RABN)のリストから構成され、それぞれの RABN は、レコードの保存先に当たるデータストレージのブロック番号を表します。ブロック番号は ISN 順に格納されます。この際、ISN n にはデータストレージ RABN を持つ n 番目のエントリが対応します。各エントリに対して 3 バイト必要になります。

アドレスコンバータに必要なスペースは、次の計算式で求めることができます。

AC = MAXISN * 3 / BL

上記式内の各項目の意味は次のとおりです。

AC

アドレスコンバータのスペース要件(ブロック数)

MAXISN

ファイルの MAXISN 設定

BL

アソシエータブロックサイズ

除算の結果は、整数に切り上げられます。

例:

MAXISN = 2,000,000
Device type 2 KB
AC     = 2,000,000 * 3 / 2048
AC     = 6,000,000 / 2048
AC     = 2929+ = 2930 blocks

データストレージのスペース要件

データストレージのスペース要件は、次の計算式で求めます。

DS = N/(BW/L) + 1

上記式内の各項目の意味は次のとおりです。

DS

データストレージのスペース要件(ブロック数)

X

ファイルにロードされるレコード数

B

データストレージのブロックサイズ

p

データストレージのブロックパディングファクタ

BW

計算式 B*(1-p/100) による実際のスペース容量

L

平均レコード長

例:

Number of records = 1,000,000
Average compressed record length = 50
Device type = 4 KB
Data Storage block padding factor = 5 percent
BW = 4096 * (1 - 5/100) = 3891
DS = 1,000,000/(3891/50) + 1 = 12,988 blocks