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

21.6. テーブル空間

PostgreSQL のテーブル空間により、データベース管理者はデータベースオブジェクトを表すファイルを格納できるファイルシステム上の場所を定義することができます。 テーブル空間を一度作成すると、データベースオブジェクトを作成する時に名前により参照することができます。

テーブル空間を使用することで、管理者は PostgreSQL インストレーションのディスクレイアウトを制御することができます。 これは、少なくとも2つの点で有用です。 1つは、クラスタを初期化したパーティションもしくはボリュームの容量が不足し、拡張を行うことができない場合、システムを再構成するまで、別のパーティションにテーブル空間を作成して、このテーブル空間を使用することができます。

もう1つは、テーブル空間により、管理者はデータベースオブジェクトの使用パターンに基づいてデータ格納場所を調整することができることです。 例えば、非常によく使用されるインデックスを、例えば、高価なソリッドステートディスクなどの高速・高可用性ディスクに格納することができます。 同時に、めったに使用されない保存用のデータや性能が求められていない保存用のデータを格納するテーブルを低価格・低速ディスクシステムに格納することもできます。

テーブル空間を定義するには CREATE TABLESPACE コマンドを使用してください。 以下に例を示します。

CREATE TABLESPACE fastspace LOCATION '/mnt/sda1/postgresql/data';

この場所は、既存かつ空のディレクトリでなければならず、また、 PostgreSQL オペレーティングシステムユーザが所有していなければなりません。 その後に、テーブル空間内に作成されるオブジェクトはすべてこのディレクトリ以下のファイルに格納されます。

注意: 通常、論理ファイルシステム内の個々のファイルの場所を制御することができませんので、1つの論理ファイルシステムに複数のテーブル空間を作成することは意味がありません。 しかし、 PostgreSQL にはこうした制限はありません。 実際、システムのファイルシステムの境を直接意識しません。 単に使用することを宣言したディレクトリにファイルを格納します。

テーブル空間自体の生成はデータベーススーパーユーザが行う必要があります。 しかし、その後に、データベース一般ユーザにそのテーブル空間を使用させることができます。 これを行うには、ユーザにテーブル空間に対する CREATE 権限を与えてください。

テーブル、インデックス、およびデータベース全体は特定のテーブル空間に割り当て可能です。 これを行うには、指定テーブル空間に CREATE 権限を持つユーザが関連するコマンドにテーブル空間をパラメータとして渡す必要があります。 例えば、以下は space1 テーブル空間にあるテーブルを作成しています。

CREATE TABLE foo(i int) TABLESPACE space1;

他の方法として、以下のように default_tablespace パラメータの使用があります。

SET default_tablespace = space1;
CREATE TABLE foo(i int);

default_tablespace が空文字以外の何かに設定された場合、この値が、明示的なテーブル空間の指定がない CREATE TABLE コマンドや CREATE INDEX コマンドの暗黙的な TABLESPACE 句として適用されます。

temp_tablespaces というパラメータも存在します。 これは、一時テーブルとそのインデックス、大規模データ集合のソートなどを目的に使用される一時ファイルの場所を決定するものです。 これは、テーブル空間名を1つだけ指定するものではなく、テーブル空間名のリストを取ることができます。 このため、一時的なオブジェクトに関連する負荷を、複数のテーブル空間にわたって分散することができます。 一時的なオブジェクトを作成する度に、このリストから無作為に要素が選択されます。

データベースに関連付けされたテーブル空間は、そのデータベースのシステムカタログを格納するために使用されます。 さらに、 TABLESPACE 句を付けずに、または、(適切な) default_tablespace temp_tablespaces で指定された選択肢がなければ、データベース内に作成されたテーブルやインデックスのデフォルトのテーブル空間としても使用されます。 テーブル空間の指定なしで作成されたデータベースは、コピー元のテンプレートデータベースのテーブル空間と同じものを使用します。

データベースクラスタが初期化される時に2つのテーブル空間が自動的に作成されます。 pg_global テーブル空間は共有システムカタログ用に使用されます。 pg_default テーブル空間は template1 template0 データベースのデフォルトテーブル空間です (したがって、 CREATE DATABASE TABLESPACE 句で変更されない限り、このテーブル空間が同様に他のデータベースに対するデフォルトのテーブル空間になります)。

テーブル空間は、一度作成すると、要求しているユーザが十分な権限を持っていればすべてのデータベースから使用することができます。 これは、テーブル空間を使用するすべてのデータベースのすべてのオブジェクトが削除されるまで、そのテーブル空間を削除することができないことを意味します。

空のテーブル空間を削除するには、 DROP TABLESPACE コマンドを使用してください。

既存のテーブル空間群を求めるには、以下の例のように pg_tablespace を確認してください。

SELECT spcname FROM pg_tablespace;

また、 psql プログラムの \db メタコマンドも既存のテーブル空間を列挙する際に役に立ちます。

テーブル空間の実装を単純化するために、 PostgreSQL はシンボリックリンクを使用します。 これは、テーブル空間はシンボリックリンクをサポートするシステムで のみ 使用することができるということを意味します。

$PGDATA/pg_tblspc ディレクトリには、そのクラスタで定義された非組み込みテーブル空間1つひとつを指し示すシンボリックリンクがあります。 推奨はしませんが、こうしたリンクを手作業で再定義してテーブル空間のレイアウトを調整することができます。 2点警告します。 これをサーバが実行している時に行わないでください。 PostgreSQL 9.1およびそれ以前の場合、 pg_tablespace カタログを新規の場所に更新してください。 (これを行わないと、 pg_dump は古いテーブル空間の場所に出力し続けます。)


powered by SEO.CUG.NET