範囲がクラスター化された表

範囲がクラスター化された表 (RCT) の表レイアウト体系では、表の各レコードが、事前定義されたレコード ID (RID) を持ちます。 RID は、表の中のレコードを見つけるために使用される内部的な ID です。

レコードのキー値と、特定の表の行のロケーションとを関連付けるために、アルゴリズムが使用されます。 このアプローチにより、特定の表の行に対して非常に高速なアクセスが提供されます。 このアルゴリズムは、ハッシュを使用しません。 ハッシュは、キーと値の順序を保持しないからです。 この順序を保持することにより、時間が経過しても表データを再編成する必要がなくなります。

表内の各レコードのキー値は、以下の条件を満たす必要があります。
  • ユニーク
  • 非NULL
  • 整数 (SMALLINT、INTEGER、または BIGINT)
  • 単調に増加する
  • 事前に決定された、キーの各列に基づく一連の範囲内にある。 (必要な場合は、CREATE TABLE ステートメントで ALLOW OVERFLOW オプションを使用して、定義されている値の範囲を越えるキー値を持つ行が許可されるようにします。)
範囲がクラスター化された表には、特定の表の行への直接アクセス以外にも、以下の利点があります。
  • 保守の必要性が低い。 挿入、更新、あるいは削除のたびに更新する必要のある、B+ ツリー索引などの 2 次構造がない。
  • 類似のサイズの B+ ツリー索引を持つ REGULAR 表と比較した場合、RCT でのロギング回数が少なくて済む。
  • 必要なバッファー・プール・メモリーが少ない。 B+ ツリー索引などの 2 次構造を格納するための追加のメモリーが不要。

RCT のためのスペースは事前割り振りされていて、レコードがまだない場合でも、表で使用するために予約されています。 そのため、範囲がクラスター化された表には、フリー・スペース制御レコード (FSCR) が不要です。 表の作成時、表には何もレコードが入っていませんが、 ページの範囲全体は事前割り振りされています。 事前割り振りは、レコードのサイズと、保管されるレコードの最大数に基づいて決定されます。 VARCHAR のような可変長フィールドが定義されている場合は、 フィールドの最大長が使用され、レコード全体のサイズは固定長になります。 そのため、スペースを最適に使用できなくなります。 キー値がまばらである場合は、 未使用のスペースにより、範囲スキャンのパフォーマンスが低下します。 範囲スキャンは、範囲内で可能性のあるすべての行をスキャンする必要があり、データがまだ含まれていない行も対象になります。

範囲がクラスター化された表に対してスキーマの変更が必要になった場合は、 新しいスキーマ名を使用して表を再作成し、前の表からデータを取り込む必要があります。 例えば、表の範囲を変更する必要がある場合は、 新しい範囲を持つ表を作成し、以前の表からデータを取り込みます。

RCT がオーバーフロー・レコードを許可する場合、新規レコードのキー値が、定義されている値の範囲を越えると、そのレコードはオーバーフロー域に配置されます。オーバーフロー域は動的に割り振られます。 オーバーフロー域に追加されるレコードの数が増加すると、このオーバーフロー域に関連する表に対する操作の処理時間が増加します。 オーバーフロー域へのアクセスにかかる時間は、オーバーフロー域が大きくなるほど長くなります。 これが問題になる場合は、より大きな範囲を持つ新規の RCT にデータをエクスポートして、オーバーフロー域のサイズを削減することを考慮してください。