今回のチューニング
これまではPostgreSQLのパラメータを調整してきましたが、今回は少々違ったアプローチでチューニングしてみたいと思います。
データベースは大量のデータを保管・検索するシステムですから、ハードディスクへのアクセス量は非常に多くなります。ですから、データベースサーバの性能はハードディスクのデータ転送速度に左右されるといっても過言ではありません。
そこで考えられるのが、ハードディスクを複数台搭載して全体としてのデータ転送速度を向上させるチューニング方法です。ただし複数台のハードディス クを"同時"に使わないと効果は期待できませんから、データベースも複数台のハードディスクに分割して格納するような工夫が必要になります。
そこで今回は、PostgreSQL 8.0で導入された「テーブルスペース」を取り上げます。
テーブルスペースとは
テーブルスペースとは、データベースオブジェクト(データベース、テーブル、インデックス、 シーケンス)を格納する記憶領域のことです。PostgreSQLでは、特にテーブルスペースを意識しなくてもデータを保管することはできますが、それは デフォルトの記憶領域を用いているからです。このデフォルトで用いられる記憶領域のことを「デフォルトテーブルスペース」と呼びます。
デフォルトテーブルスペースの記憶領域は、通常/usr/local/pgsql/dataになります(ディレクトリを変更している場合やRPM等 のパッケージでインストールしている場合には異なることがあります)。ですから、デフォルトではすべてのデータベースオブジェクトは/usr/local /pgsql/data以下に格納されていることになります。
PostgreSQLサーバの管理者であればテーブルスペースは自由に作成することができます。その際、データの記憶領域として使いたいディレクトリとそれに付ける名前(テーブルスペース名)を指定しますが、ディレクトリはPostgreSQLサーバプロセスからアクセスできる必要がありますので、 オーナーとパーミッションには気をつける必要があります。なおディレクトリは予め作成しておく必要があります。
テーブルスペースの使い方
テーブルスペースは下記のSQL文で作成します。
CREATE TABLESPACE テーブルスペース名> [ OWNER ユーザ名> ] LOCATION 'ディレクトリ>';
下記は、/disk1/pgdataというディレクトリにdisk1というテーブルスペースを作成するSQL文の例です。
template1=# CREATE TABLESPACE disk1 LOCATION '/disk1/pgdata';
CREATE TABLESPACE
テーブルスペースの一覧は以下のようになります。
| template1=# \db+ | ||||||
| 名前 | | | 所有者 | | | 場所 | | | アクセス特権 |
| −−−−− | + | −−−−−−−−−− | + | −−−−−− | + | −−−−−− |
|
|
| | postgres | | | | | ||
|
|
| | postgres | | | | | ||
|
|
| | postgres | | | | | ||
| (3 行) | ||||||
disk1以外にもテーブルスペースがあります。これらは最初から存在するテーブルスペースです。pg_defaultはデフォルトテーブルスペースです。pg_globalはシステムが使用しているテーブルスペースで、こちらはユーザが使うことはできません。
データベースオブジェクトを作成する際にテーブルスペース名を指定すると、データベースオブジェクトを任意のテーブルスペースに作成できます。例えば、db1というデータベースをdisk1というテーブルスペースに作成するなら以下のSQL文になります。
template1=# CREATE DATABASE db1 TABLESPACE disk1;
すでに作成済みのデータベースオブジェクトを他のテーブルスペースに移動したい場合にはALTER文が使えます。例えば、すでに作成済みのtbl1というテーブルをdisk1というテーブルスペースに移動するなら、以下のSQL文になります。
template1=# ALTER TABLE tbl1 SET TABLESPACE disk1;
テーブルスペース間の移動はコストのかかる処理です。データベースオブジェクトのサイズが大きい場合には時間がかかりますので注意が必要です。
さらに詳しい内容についてはPostgreSQLのリファレンスマニュアルを参照してください。