ディスクリプタの定義

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


ADAINV の処理に関する考慮事項

新しいディスクリプタの生成

新しいディスクリプタを定義すると、フィールド定義テーブル(FDT)が修正され、インバーテッドリストが作成されます。新しいメインインデックスおよびノーマルインデックスのブロックが、新しいディスクリプタのインバーテッドリストエントリの格納に必要です。ADAINV では、一回の実行につき複数のディスクリプタを設定できます。

ADAINV は、1 つのディスクリプタの新しいノーマルインデックスとメインインデックスをディスクリプタ単位で構築します。このパスの間は、アッパーインデックスの中のリンキングエントリはまだ存在していないので、新しいインバーテッドリストのどれもアクセスできません。すべての新規ディスクリプタのノーマルインデックスとメインインデックスが構築されると、FDT が更新され、対応するエントリがアッパーインデックスに追加されます。

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

ファイル内のすべてのデータレコードは、新しいノーマルインデックスとメインインデックスの構築のために読み込まれなければなりません。各レコード内で、新しいディスクリプタに関係するフィールドは、ディスクリプタ値とその ISN の生成に使用されます。これらの値は、昇順のディスクリプタ値と ISN に従ってソートされます。ソートの出力は、新しいノーマルインデックスとメインインデックスの構築に使用されます。ユニークオプションで定義されたディスクリプタは、ノーマルインデックスがディスクリプタ値ごとに 1 つのみの ISN を持っているかどうかがチェックされます。複数の ISN が発見されると、矛盾する ISN がエラーログに書き込まれ、UQ_CONFLICT が RESET の場合に FDT 内のユニークフラグがリセットされ、処理は続行します。UQ_CONFLICT が ABORT に設定されているか省略されている場合、ADAINV は異常終了します。

ディスクリプタ値のソートに加えて、データレコードの読み込みは、膨大な入出力のために非常に時間を要します。そのため、1 回の実行で大量のディスクリプタを作成する場合、ADAINV は、データストレージを介した読み込みに必要なパス数の最小化を試みます。データストレージを介した最初のパスでは、1 つのディスクリプタの値は直接ソートに渡されます。2 つの追加のディスクリプタ値が存在すれば TEMP データセットに書き込まれ、残りのディスクリプタの他のすべての値があれば、それらの合計サイズおよび量が累積されます。このデータの累積は、データストレージを介する残りのパスを最適化します。各パス中に、並行して TEMP を使用するディスクリプタの数が大きくなるほど、インバート処理も速くなります。ADAINV は、実行の最後で、必要とされたパスの合計数を表示します。

ファイルのロード時に指定したパディングファクタに従って、すべてのインデックスブロックに値が設定されます。新しいインデックスブロックは、既存のエクステントから必要に応じて割り当てられます。これらのブロックがすべて使用された後、一括更新ユーティリティ ADAMUP で説明する規則にしたがって自動拡張が実行されます。

拡張が成功すれば、上記の処理が続行し、失敗すれば、ADAINV はエラーメッセージを発行して終了します。

アッパーインデックスの更新

ノーマルインデックスとメインインデックスがディスクリプタ単位で構成されるのに対し、インデックスレベル 3 以上のアッパーインデックスは、すべてのディスクリプタを含みます。新しいメインインデックスにリンクするために、新しいメインインデックスブロックごとに、1 エントリがアッパーインデックスに作成されなければなりません。新しいエントリは、次の 2 つの方法で作成できます。

  • 更新がレベル 3 ブロックのみに影響する場合は、新しいエントリは既存のアッパーインデックスに直接挿入されます。

  • ブロック分割またはレベル 3 を超えるレベルでの更新が必要になると、アッパーインデックス全体が再構築されます。ファイルのロード時に、指定したパディングファクタに従って、再度、値が設定されます。既存のインデックスブロックと、あらかじめ割り当てられているブロックは、新しくブロックが割り当てられるまで使用されます。新しいブロックが必要な場合は、ノーマルインデックスとメインインデックスのロードの説明にある手順に従ってください。

ディスクリプタの解放

ディスクリプタを解放すると、フィールド定義テーブル(FDT)が修正され、アクセスパスが削除されます。ディスクリプタに対するインバーテッドリストエントリを持つ、すべてのメインインデックスブロックとノーマルインデックスブロックは、解放されますが再使用できません。任意数のディスクリプタを 1 回の実行で解放できます。

アッパーインデックスの更新

ディスクリプタが解放されると、対応するエントリをアッパーインデックスから削除しなければなりません。これらのエントリは、次の 2 つの方法で削除できます。

  • 更新がレベル 3 ブロックのみに影響する場合は、新しいエントリは、既存のアッパーインデックスから直接削除されます。

  • ブロックが空になるか、レベル 3 を超えるレベルの更新が必要になると、アッパーインデックス全体が再構築されます。ファイルのロード時に指定したパディングファクタに従って、再度、値が設定されます。既存のインデックスブロックと、あらかじめ割り当てられているブロックは、新しくブロックが割り当てられるまで使用されます。新しいブロックが必要な場合は、ノーマルインデックスとメインインデックスのロードの説明にある手順に従ってください。

メインインデックスとノーマルインデックスの解放

原則的には、対応するエントリを FDT およびアッパーインデックスから削除するだけで、ディスクリプタを解放できます。下のインデックスレベルへのリンクを無効にすれば、メインインデックスとノーマルインデックスは実質的に削除されます。必須ではありませんが、ADAINV は、旧ディスクリプタのすべてのノーマルインデックスブロックとメインインデックスブロックを物理的にクリアします。その結果としてオーバーヘッドが発生しますが、空ブロックはダンプされないため、データのセキュリティおよびバックアップユーティリティ ADABCK のパフォーマンスが向上します。

インバーテッドリストの整合性のチェック

インバーテッドリストは、ファイル内に定義されたエレメンタリである、サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタおよびフォネティックディスクリプタごとに Adabas によって維持管理されます。これらの整合性を維持するには、次のことを確認する必要があります。

  • インバーテッドリスト内の各 ISN が既存のデータレコードに関連付けられており、このデータレコードが正しいものであること。

  • データストレージ内の各レコードが、その ISN および生成されたディスクリプタ値エントリによってインバーテッドリスト内に表されていること。

ディスクリプタの検証時には、ADAINV は、ノーマルインデックスのロードをシミュレートし、ソートの出力とインバーテッドリストの内容を照合します。これは、一度の実行で前述した点の両方をチェックし、一意性の矛盾を検出します。発見されたすべての矛盾は出力されます。このとき、ファイルは修正、変更されません。

拒否されたデータレコード

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

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