CLUSTER

Name

CLUSTER  --  記憶領域のクラスタリング通知をサーバに与える。

Synopsis

CLUSTER indexname ON table
  

入力

indexname

インデックス名。

table

テーブル名。

出力

CLUSTER

クラスタリングに成功した場合。

ERROR: relation <tablerelation_number> inherits "table"

ERROR: Relation table does not exist!

説明

CLUSTERPostgrestable で指定されたクラスを indexname で指定されたインデックスに基づいてクラスタリングするよ うに指示します。 このインデックスは classname に対して定義されていなければなりません。

クラスがクラスタリングされた場合、インデックス情報に基づい た物理的な順番付けが再度行なわれます。 クラスタリングは静的なものです。 言い替えると、クラスが更新された時、その変更はクラスタリン グされません。 新しいインスタンスや更新されたタプルをクラスタリング状態を 維持するような処理は行なわれません。 維持させるためには、手作業でこのコマンドを再発行して、再度 クラスタリングを行なうことで可能です。

注意

実際には、テーブルは一時テーブルにインデックスの順番でコピー され、そして、元の名前に戻されます。 このため、クラスタリングが行なわれると、与えられた全ての権 限と他のインデックスは破棄されます。

テーブル内の 1 つの行にランダムにアクセスする場合、ヒープ テーブルにおけるデータの実際の順番は重要ではありません。 しかし、他のデータよりもある特定のデータへのアクセスが頻 繁で、それらをグループにまとめたインデックスがある場合、 CLUSTER を使用する効果があります。

CLUSTER が役に立つ他の点は、インデッ クスを使用してテーブルから複数の行を取り出す場合です。 インデックスが一致する最初の行を持つヒープページを一度 識別すれば、一致する他の全ての行はおそらく同一のヒープ ページにあることになります。これにより、ディスクアクセ スの回数が節約でき、問い合わせの速度が向上しますので、 テーブルからインデックスされた値の範囲を要求する場合や、 複数の行が 1 つのインデックスされた値に一致する場合、 CLUSTER は役に立ちます。

データをクラスタリングするには、2 つの方法があります。 1 つ目は CLUSTER コマンドを使用して、 指定したインデックスの順番で元のテーブルを再順番付けす ることです。 行はインデックスの順番でヒープから入手されますが、ヒープ テーブルが順序付けされていない場合は、項目はランダムなペー ジに存在することになります。ですので、行を移動する毎に 1 つ のディスクページの入手が行なわれます このため、これは大きなテーブルの場合はより遅くなります。 Postgres にはキャッシュがあり ますが、大きなテーブルの大部分はキャッシュには収まりませ ん。

データをクラスタリングする他の方法は、

SELECT columnlist INTO TABLE newtable
     FROM table ORDER BY columnlist
    
を使用することです。 これは、インデックスに一致させるために ORDER BY 句の Postgres のソート用コー ドを使用していますので、順序付けされていないデータに 対してかなり高速になります。 そして、古いテーブルを削除し、 ALTER TABLE/RENAME を使用して、 temp を元の名前に変更し、全てのインデックスを再作成します。 OID が保持されないことが唯一の問題 です。 この後、ほとんどのヒープデータは既に順序付けされていま すし、既存のインデックスが使用されますので、 CLUSTER は高速になるはずです。

使用法

給与属性に基づいて、従業員リレーションのクラスタリング を行ないます。

CLUSTER emp_ind ON emp;
  

互換性

SQL92

SQL92 には CLUSTER 文はありません。