無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

CLUSTER

名前

CLUSTER -- インデックスに従ってテーブルをクラスタ化する

概要

CLUSTER [VERBOSE] 

table_name

 [ USING 

index_name

 ]
CLUSTER [VERBOSE]

説明

CLUSTER は、 index_name で指定されたインデックスに基づき、 table_name で指定されたテーブルをクラスタ化するように、 PostgreSQL に指示します。 このインデックスは前もって table_name で定義されていなければなりません。

テーブルがクラスタ化されると、それぞれのテーブルはインデックス情報に基づいて物理的に並べ直されます。 クラスタ化は、1回限りの操作です。 クラスタ化後にテーブルが更新されても、その変更はクラスタ化されません。 つまり、新規に追加された行や更新された行は、インデックス順には保管されません。 (インデックス順に保管したい場合は、コマンドを再度入力し、定期的に再クラスタ化を行います。 また、更新される行は十分な領域が利用可能ならば同一ページ内に保持されますので、テーブルの FILLFACTOR 格納パラメータを100%より小さく設定することで、更新処理中のクラスタ順序付けを保護するという点で役に立ちます。)

テーブルがクラスタ化されると、 PostgreSQL はクラスタ化に使用されたインデックスを記録します。 CLUSTER table_name という構文によって、以前と同じインデックスを使用してテーブルを再クラスタ化します。 また ALTER TABLE CLUSTER もしくは SET WITHOUT CLUSTER 構文を使用して、将来のクラスタ化操作で使用するインデックスを設定したり、任意の過去の設定を取り消すことができます。

パラメータを指定しないで CLUSTER を実行した場合、呼び出したユーザが所有する現在のデータベース内の全てのテーブルを(スーパーユーザの場合は、全てのテーブルを)クラスタ化します。 このパラメータを指定しない CLUSTER を、トランザクションブロック内で実行することはできません。

クラスタ化を行っているテーブルは、 ACCESS EXCLUSIVE ロックを獲得しています。 これにより、 CLUSTER が終わるまで、そのテーブルに対するデータベース操作(読み書き両方)を防ぐことができます。

パラメータ

table_name

テーブルの名前です(スキーマ修飾名も可)。

index_name

インデックスの名前です。

VERBOSE

各テーブルのクラスタ化を行う時に進行状況報告を出力します。

注釈

テーブル内の1つの行にランダムにアクセスする場合、テーブル内のデータの順序は重要でありません。 しかし、テーブル内の特定のデータにアクセスが集中している場合、それらのデータをグループ化しているインデックスが存在する時は、 CLUSTER による利益を享受できます。 テーブルからインデックスの値の範囲や、一致する複数の行を保有する1つのインデックスの値などが知りたい場合、 CLUSTER が役に立ちます。 一度インデックスが一致する行に対するテーブルページを認識すると、一致する他の全ての行も同じテーブルページに存在する可能性が高いので、ディスクアクセスを減らして問い合わせ処理の速度を向上することができるからです。

CLUSTER は、指定されたインデックスによるインデックススキャン、または(インデックスがB-Treeの場合)シーケンシャルスキャン後のソートのいずれかを用いて、テーブルを再ソートすることができます。 プランナのコストパラメータと利用可能な統計情報に基づき、より高速な方式の選択を試みます。

インデックススキャンが使用される場合、インデックス順にテーブルデータを並べた、テーブルの一時コピーが作成されます。 同様に、テーブルの各インデックスの一時コピーも作成されます。 したがって、ディスクには、少なくともテーブルとインデックスの合計サイズと同じ容量の空き領域が必要です。

シーケンシャルスキャンとソートが使用される場合も一時的なソートファイルが作成されます。 一時的に必要となるサイズの最大値はテーブルサイズの倍のサイズにインデックスサイズを加えた値となります。 この方式はインデックススキャンより高速になることが多いのですが、必要なディスク容量に耐えられない場合は、一時的に enable_sort off にすることで、この方式を無効にすることができます。

クラスタ処理の前に maintenance_work_mem を程良く大きな値に設定することを勧めます。 (しかしメモリ容量以上は CLUSTER 操作用に割り当てられません。)

プランナはテーブルの順序付けに関する統計情報を記録しているため、新しくクラスタ化されたテーブルでは、 ANALYZE を実行することが推奨されます。 そうしないと、プランナが問い合わせ計画を適切に選択できない可能性があります。

CLUSTER はどのインデックスでクラスタ化したかを記録していますので、対象のテーブルを定期的に再クラスタ化できるように、最初にクラスタ化したいテーブルを手作業でクラスタ化し、その後にパラメータをまったく持たない CLUSTER を実行する定期的な保守用スクリプトを設定することができます。

employees_ind インデックスに基づいて、 emp テーブルをクラスタ化します。

CLUSTER employees USING employees_ind;

以前に使用したインデックスを使用して、 employees テーブルをクラスタ化します。

CLUSTER employees;

データベース内の、以前にクラスタ化されたテーブルを全てクラスタ化します。

CLUSTER;

互換性

標準SQLには CLUSTER 文はありません。

CLUSTER 

index_name

 ON 

table_name

という構文も、8.3より前のバージョンの PostgreSQL との互換性のためサポートされます。

関連項目

clusterdb

powered by SEO.CUG.NET