BTREE構造は、インデックスに対する格納構造です。内部的には、木構造のインデックス部とデータ部からなっています。インデックス部は、インデックスのキーと実表データとの対応情報の組の値からなっており、データを格納するページを管理します。インデックス部に対して、データを格納するページからなる部分を、“データ部”と呼びます。
DSO定義のベース表現としてADDRESSが指定された場合は、実表データとの対応情報として表のレコードの格納アドレスが使用され、KEYが指定された場合は、クラスタキーが使用されます。
データ部のあるページにデータが収まらない場合は、Symfoware/RDBが新しいページを切りだし、そのページと元のページとの間でデータを分配して格納します(これをページスプリットと呼びます)。データ部のページスプリットにともなって、インデックス部のページスプリットが行われる場合があります。
インデックスのキーが一意キーでない場合には、1つのインデックスキーの値に対して複数の実表データとの対応情報の値が存在することがあります。また、その重複度(実表データとの対応情報の数)もインデックスのキーの値に依存し一定ではありません。そのため、BTREE構造では、インデックスのキーと実表データとの対応情報を組にして管理します。このキーの組に対して昇順を保証します。さらに、格納効率を良くするため、インデックスのキーの部分を前方圧縮します。
以下に在庫表を例にとってBTREE構造の概略を示します。この例では、倉庫番号の列の上にインデックスが定義され、また表の格納構造はSEQUENTIAL構造であるとします。
データの処理の効率に一番影響のある要因は入出力回数です。BTREE構造の場合は以下の特徴があります。
データ処理で、インデックスのキー値の範囲を指定した場合、または列の組からなるインデックスのキーの上位の列の値だけを指定した場合には、入出力回数はインデックス部の高さに依存します。
それ以外の場合には、当該のインデックスは使用されません。
BTREE構造では、インデックス部とデータ部に対して、それぞれのページ長を独立に指定できます。データ部のページ長はDSO定義のPAGESIZE1オプションで指定します。インデックス部のページ長はPAGESIZE2オプションで指定します。
インデックスのキーと実表データとの対応情報の組の値が、インデックス部およびデータ部の1ページに2件収まる必要があります。
インデックス部およびデータ部に収まるデータ量が少ない場合には、ページの使用率(データの格納率)が悪くなります。したがって、ページの使用率を高めるためには、余裕をもったページ長の指定が必要です。
データ部のページ内に収まるデータの最大数は、ページスプリットの契機を考慮して設定する必要があります。ぺージスプリットが頻発すると処理効率が悪くなります。
インデックスは、1つの実表に対して複数付加することができます。検索の場合には、インデックスの付加によって処理効率を上げることができます。しかし、以下のような場合には、関連するすべてのインデックスのアップグレード処理が行われるため、全体としての処理効率が低下することがあるので注意が必要です。
アプリケーションの処理で、インデックスを付加している列の値または実表データとの対応情報を更新している
アプリケーションの処理で、挿入や削除が主体である