ジェネリックテーブルバッファとフルテーブルバッファ 

ジェネリックテーブル領域またはフルテーブルは、ジェネリック / フルテーブルバッファ TABL 内で管理されます。個々のジェネリック領域は、フルバッファリングされたテーブルと同様にバッファ内で管理されます。

原理とバッファアクセス

シングルレコードバッファと同様に、ジェネリック / フルテーブルバッファには、中央管理構造、テーブルディレクトリ、データ領域が含まれます。

ジェネリック / フルバッファとシングルレコードバッファの最大の相違点は、データ領域の管理にあります。ジェネリック / フルバッファの記憶領域は、可変長の領域 ( エクステント ) に分割されます。エクステントの長さは、固定ブロックサイズ (256 バイト ) の倍数です。バッファ管理では、ジェネリックテーブル領域またはテーブル全体の内容は、 1 つのエクステントに配置されます。そのためシングルレコードバッファリングと比べ、バッファ内データに必要な容量が少なくて済みます。

テーブル名は、テーブルディレクトリにアルファベット順にソートされます。データレコードは、すでにデータベースによってソートされた状態で対応するエクステントに、 1 ステップで転送されます。バッファアクセスがあると、まずテーブルディレクトリ内の対応するテーブル名がバイナリ検索されます。次に、エクステント内の対応するデータレコードが、バイナリ検索されます。

置換

シングルレコードバッファリングの場合と異なり、ジェネリック / フルバッファリングの場合の置換は決まった時間に非同期で実行されます。これらの実行時間は、バッファへのアクセス回数に応じて動的に定義されます。つまり、 2 回の置換の間隔はバッファ使用率によって決まります。

データが置換されるのは、バッファ内の空き領域が既定値を下回ったり、アクセス時にアクセスの質 ( つまり、バッファから直接満たすことのできるアクセスの回数 ) が十分でないときだけです。この場合、バッファの特定の領域を解放する試みがなされます。したがって、特定の時刻に多数のテーブルが置換されます。

アクセス頻度がもっとも少ないテーブルが置換されます。テーブルアクセスについては、アクセス時間に応じて加重がかけられます。過去のアクセスは置換の直前に発生したアクセスよりも加重が少なくなります。

この方法では、特定の時間に頻繁にアクセスされたあとは二度とアクセスされないタイプのテーブルが、一定の時間が経過したあとで置換されます。

ジェネリックバッファリングされたテーブルでは、バッファの個々のジェネリック領域が独立したテーブルとして扱われます。このためテーブルのジェネリック領域には、置換できるものもあればバッファに保管されるものもあります。

テーブルが置換されると、バッファが一定の間隔で再編成され、その結果バッファの断片化が減少します。

グローバルな同期化

分散システムでは、ローカルバッファで行なわれる変更を同期化して、バッファデータの整合性を保持する必要があります。同期化の基本的な手順については、 ローカルバッファの同期化を参照してください。

ジェネリック / フルバッファのローカル同期化とグローバル同期化に対し、各種 ABAP コマンドは以下のように機能します。

WHERE 条件 (UPDATE dbtab WHERE ... DELETE FROM dbtab WHERE ...) を使って変更が加えられるときは、同期化のときにローカルサーバ ( コマンドが実行されたサーバ ) のバッファ内だけでなく他のすべてのサーバでもジェネリック領域またはテーブル全体が無効になります。

WHERE 条件 (UPDATE dbtab INSERT dbtab 、および DELETE dbtab) を使用しない変更では、同期化のときにローカルサーバのバッファ内の対応するレコードが変更されます。その他すべてのサーバでは、バッファ内のジェネリック領域全体またはテーブル全体が無効化されます。

このため WHERE 条件を使用しての変更は、 WHERE 条件を使用しない場合よりもはるかに大きな負荷がバッファ管理にかかることになります。