24.3. PostgreSQL の特徴と機能

PostgreSQL の特徴、および機能としては、以下のような点が挙げられます。Turbolinux 10 Server で収録しているバージョンは、postgresql-7.4.5 です。より詳細な情報は、PostgreSQL の Web サイトやオフィシャルマニュアルを参照してください。

オープンソースの RDBMS

PostgreSQL は、BSD ライセンスに基づき配布されており、商用/非商用を問わず無償で使用でき、利用目的に制限もありません。また、ソースコードも公開されています。

数多くのプラットフォームをサポート

Linux、FreeBSD、NetBSD、OpenBSD、Solaris、HP-UX、AIX などの UNIX 系システムだけでなく、WindowsNT/2000(Cygwin を利用)、Mac OS X など多彩なプラットフォームでの動作が確認されています。

クライアント/サーバー型アーキテクチャ

PostgreSQL は、クライアント/サーバー型アーキテクチャを採用しており、クライアント(フロントエンド)は、PostgreSQL が動作しているデータベースサーバー(バックエンド)にネットワーク経由でアクセスすることが可能です。従来の 2 階層システム、およびアプリケーションサーバーを利用した 3 階層システムの構築が可能です。また、PostgreSQL は、フロントエンドとデータベースエンジンを提供するバックエンドが完全に独立しているため、フロントエンド側で必要となるライブラリは少なくて済みます。

マルチバイト対応

PostgreSQL では、マルチバイト/UNICODE に対応しています。テーブル名、カラム名、格納するデータにマルチバイトコードが利用できます。LIKE や正規表現によるマルチバイト検索もサポートしています。

SQL92、および SQL99 の一部をサポート

データベースの標準言語である SQL には、いくつかのバージョンが存在しますが、PostgreSQL は SQL92 のほとんどの機能をサポートしています。SQL の最新バージョンは SQL99 で PostgreSQL もその一部をサポートしますが、PostgreSQL に限らず、ほとんどの RDBMS が SQL92 のサポートにとどまっているのが現状と言えます。

数多くのプログラミング言語インターフェースをサポート

PostgreSQL は、標準で非常に多くのプログラムインターフェースをサポートしています。詳細については、項24.7を参照してください。

ストアドプロシージャをサポート

PostgreSQL では、C 言語、SQL 等を使用して、バックエンドで動作するユーザー定義の関数を作成することができます。

強力なロック機構をサポート

PostgreSQL は、他の RDBMS 同様、行レベルのロックおよびテーブルレベルのロックをサポートしています。さらに、MVCC(MultiVersion Concurrency Control)により、トランザクションの高度な同時アクセス制御を実装しています。MVCC により、あるトランザクションがデータベースにデータを書き込み中であっても、別のトランザクションが同じカラムのデータを読み出すことが可能です。逆にあるトランザクションがデータを読み込み中であっても別のトランザクションはデータの書き込みが可能です。

外部キー(参照整合性制約)をサポート

外部キーは、複数のテーブル間のデータの整合性を保つ機能でほとんどの商用DBが実装している機能です。PostgreSQL も 7.0 から外部キーをサポートしています。

TOAST(The Oversized-Attribute Storage Technique)によるレコード長制限の撤廃

PostgreSQL 7.1 以前のバージョンでは、1 レコードのサイズは 8K バイトという制限がありました。それ以降のバージョンでは TOAST の実装により、1 レコードの 1 列あたり最大 1GB までのデータを扱うことが可能となりました。

WAL(Write-Ahead Logging)トランザクションログの実装

PostgreSQL 7.1 以前のバージョンでは、トランザクションの COMMIT が発行されるとすぐに、ハードディスクにデータの書き込みを行っていました。この方法は、データの信頼性は保障されますが、テーブルに対して追加、更新が行われるたびにディスクへのアクセスが発生するため、他の RDBMS と比較した場合のパフォーマンスに問題がありました。そこで、PostgreSQL 7.1 からは、WAL と呼ばれるトランザクションロギングの手法が実装されています。WAL は、データそのものをすぐにハードディスクに書き込むのではなく、トランザクションログだけを先にハードディスクに書き込みます。これにより、特に更新トランザクションの処理速度が大幅に改善されました。何らかの障害が発生したとしてもハードディスクに保存されているテーブルとWALにより、障害発生前の状態に復元することが可能です。

外部結合(OUTER JOIN)をサポート

PostgreSQL 7.1 より SQL92 の OUTER JOIN(外部結合)構文がサポートされ、外部結合を利用した SQL構文が利用可能です。ただし、UNION JOIN は実装されていません。

VACUUM

PostgreSQL では、DELETE された行は実際に削除されるわけではなく、削除フラグを立て論理的に削除されたかのように見せます。UPDATE に関しても、更新する行を INSERT してから、更新前の行に削除フラグを立てます。これは、頻繁にデータの更新、削除が行われた場合にデータベースのサイズが増大する一方であることを意味します。そこで、PostgreSQL は、このデータベースの不要領域の掃除と統計情報の生成をするためにデータベースに対して定期的に PostgreSQL 固有のコマンドである VACUUM コマンドを実行することが推奨されています。以前のバージョンでは、VACUUM の処理中はテーブルをロックしていましたが、PostgreSQL 7.2 からはテーブルをロックしなくなり、VACUUM 中でもテーブルの検索や更新が可能となりました。これにより、PostgreSQL はデータベースとしての連続運用性能を大幅に向上させました。しかし、この VACUUM はデータベースの空き領域を再利用できるようにするだけでデータベースのサイズを小さくするわけではありません。サイズを小さくするためには、VACUUM FULL を使用しますが、これは従来の VACUUM と同様にテーブルをロックします。

ホットバックアップをサポート

データベースを運用した状態でバックアップ可能なホットバックアップをサポートしているため、バックアップ中でもデータの更新や削除などが可能です。バックアップは、pg_dump という PostgreSQL の専用ツールを使用して行います。データベース単位、テーブル単位でのバックアップが可能です。

オブジェクトリレーショナル機能

PostgreSQL は、ORDBMS(Object Relational DataBase Management System)であるとも言われます。ORDBMS は、RDBMS にクラス、継承、型、関数などオブジェクト指向の概念を取り入れて複雑なデータを扱いやすくする次世代 RDBMS といえます。PostgreSQL におけるオブジェクト拡張としては、配列のデータ型、OID(Object Identifier)、テーブル定義の継承、ユーザー定義データ型などがあげられます。このようなオブジェクト指向の概念を取り入れた RDBMS であるという特徴により、PostgreSQL は ORDBMS のカテゴリに分類されていると言えます。