RANDOM構造は、データに対して、そのキーとなる列の組の値から格納するページ(これをバケットと呼びます)を計算し、格納する構造になっています。ページにデータが収まらない場合は、Symfoware/RDBが自動的にオーバフロー部のページを切りだして、そのバケットに割り当て、データを格納します。元のバケットが属するページをオーバフロー部に対してプライム部と呼びます。
データを格納するページを決める列の組をクラスタキーと呼びます。クラスタキーは、表のDSO定義のCLUSTERオプションで指定されたキーです。CLUSTERオプションを省略した場合には、クラスタキーは対応する表定義の主キーになります。RANDOM構造の場合、等しいクラスタキーの値をもつデータは、同一のバケットに格納します。
クラスタキーの値からバケットを決める計算に使用する関数を、ハッシュ関数と呼びます。データを格納するバケットは、ハッシュ関数により、Symfoware/RDBが自動的に決定します。表のDSO定義文の格納オプションにRULEを指定している場合は、RULEに指定した値式を計算した結果により、データを格納するバケットを決定します。
在庫表を例にRANDOM構造の概略を以下に示します。
データの処理の効率に一番影響のある要因は入出力回数です。RANDOM構造の場合は以下の特徴があります。
データ処理で、条件式にクラスタキーのすべての値を指定し、かつクラスタキーに一意性制約が設定された場合には、入出力回数はデータ量にほぼ無依存になります。
それ以外の場合(データ処理でクラスタキー全部が指定されていない場合)には、全データを参照するため、入出力回数はデータ量に大きく依存します。
RANDOM構造では、プライム部のバケットを1つのページに対応させ、これとは独立に、オーバフロー部のバケットも1つのページに対応させます。それぞれのページ長は独立に指定できます。プライム部のページ長はDSO定義のPAGESIZE1オプションで、オーバフロー部のページ長はPAGESIZE2オプションで指定します。
ページ長を指定するときは、以下の考慮が必要です。
表の1行に対応するデータが1ページに収まる必要があります。
平均入出力回数(ページ内のデータ数に依存)を考慮して、プライム部のページ長を設定する必要があります。
表のDSO定義文の格納オプションにRULEを指定することにより、データを格納するバケットを決定する規則を指定することができます。RULEを指定する場合には、以下の注意が必要です。
計算結果が負数となる値式は指定できません。
表に格納するクラスタキーの値と、データベースの入出力回数や格納効率を考慮(業務に依存)して、RULEに指定する値式を設計する必要があります。
データを格納するバケットは、RULEに指定した値式を計算した結果をバケット数で割った余りの値により決定します。以下にデータの格納方法の概略を示します。
備考.値式の計算結果が負数になると、エラーとなります。
以下に、RULEを指定した場合の表のDSO定義例を示します。
クラスタキーが昇順に発生する場合で、格納効率を高め、かつ、データがオーバフロー部に格納されるのを防ぎます。製品情報表のレコード長を200バイトとします。プライム部のページ長(PAGESIZE1)と、1ページに4件のデータを格納することを考慮してRULEに指定する値式を設計します。
CREATE DSO 製品情報表DSO FROM A社.製品情報表
TYPE RANDOM ( PAGESIZE1(1), PAGESIZE2(1), CLUSTER(製品番号),
RULE(製品番号/4))
備考.表のデータ件数を考慮した十分なバケット数が必要です。
バケット数は、表のDSI定義の割付け対象で指定したプライム部の割付け量とプライム部のページ長から求めることができます。バケット数は、次の式で求めます。(1を引くのは、Symfoware/RDBがページを管理するために1ページ分を使用するためです。)
プライム部の割付け量 バケット数 = --------------------- - 1 プライム部のページ長