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で指定された選択肢がなければ、データベース内に作成されたテーブルやインデックスのデフォルトのテーブル空間としても使用されます。 テーブル空間の指定なしで作成されたデータベースは、コピー元のテンプレートデータベースのテーブル空間と同じものを使用します。
initdbにより、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点警告します。 これをサーバが実行している時に行わないでください。 また、サーバを再起動した後に、新しい場所を表示するようにpg_tablespaceカタログを更新してください (これを行わないと、pg_dumpが古いテーブル空間の場所を示したままになってしまいます)。