PostgreSQL

概要

PostgreSQLはIllustraや、Illustraを買収しその技術を採りいれたInformixとともにオブジェクト関係データベース管理システムを実装してきた。
問い合わせ言語には SQL を用いており、SQL92, 99の大部分と、2003, 2008の一部をサポートしている。(一覧 サポートあり / なし)

市場シェア

DB-Engines.comによるマーケットシェア調査では、2018年2月現在、Oracle Database、MySQL、Microsoft SQL Server に続いて4位であり、MySQL とのシェアの差は年々縮まる傾向にある。
2012年7月当時は、クラウドサービスプロバイダの Jelastic によると、オープンソースDBの中でのPostgreSQLの世界シェアは Jelastic のユーザー内では14%程度であった（MySQL系 70%（Mysql56%、MariaDB 14%）、MongoDB 15%）。日本の Jelastic のユーザー内では8%であり（MySQL系 66%（Mysql50%、MariaDB 16%））、世界的なシェアとは状況が異なる。

関数

関数（ストアドファンクション）によりサーバで実行される処理のまとまりを定義できる。PostgreSQL は行を返却する関数を定義することができる。関数の出力は複数の行であり、クエリの中でテーブルと同様に扱うことができる。実行するユーザまたは定義したユーザのどちらの権限で実行されるかを指定して関数を定義できる。
関数の定義には SQL の他、分岐やループをサポートする下記の言語で実装することが可能である。言語によっては関数をデータベーストリガとして実行することもできる。

トリガ

データベーストリガは SQL データ操作言語 (SQL DML) の文 (INSERT, UPDATE / UPDATE OF, DELETE, TRUNCATE) を実行した際に呼び出される。
利用例として、INSERT 文で挿入される値が妥当かの検証がある。
トリガが実行される条件は WHEN 句で与えることができる。
トリガはテーブルに対してのみ定義できる。
ビューに対するトリガが必要な場合には、代わりにルールを使用する。
複数のトリガが定義されている場合、アルファベット順に実行される。
トリガで実行される処理は関数として定義する。
トリガ用の関数の定義には SQL 関数は使用できないが、PL/pgSQL やその他の多くの関数用言語を使うことができる。

ルール

ルールにより SQL の内部表現である「クエリ木」を書き換えることができる。
一般的なルールの用途は更新可能ビューを実現することであり、標準 SQL で規定される "INSTEAD OF" トリガ の代わりに用いられる。

パーティショニング

PostgreSQL 8.1 より、パーティショニングを組み込みでサポートしている。バージョンが上がる度に機能が追加されている。
テーブル・パーティショニングは継承を用いて実現する。
これは、Oracle Database 7 のパーティション・ビューに近い実装である。
テーブルを作成する際、他テーブルを「親」テーブルとして指定し、継承関係を定義できる。
「子」テーブルに挿入された行は、親テーブルを参照した際にも取得される。
親テーブルに対する列の追加やCHECK制約の定義は自動的に子テーブルにも反映されるが、外部キーや一意性制約は継承をサポートしていない。
パーティショニングされたテーブルへは親テーブルを通してアクセスする。
SELECT, UPDATE, DELETE 文は子テーブルを含むよう展開されるが、クエリの条件が CHECK 制約に適合しない子テーブルは設定により自動的に除外することもできるため効率よく処理できる。
INSERT については、バージョン10以降は宣言的テーブルパーティショニングにより子テーブルに振り分けることが出来る。バージョン9.6までは、子テーブルを直接指定するか、親テーブルにトリガを作成することで挿入先を指示して振り分けることが出来る。

レプリケーション

PostgreSQL 9.0 より、ストリーミングレプリケーションを組み込みでサポートしている。トランザクションログを転送し、全てのデータベース・ファイルの変更をコミット後に他のサーバへ非同期に転送する。単一マスタと複数スレーブを構成でき、スレーブは参照の問い合わせを受け付ける。参照処理を複数のノードで負荷分散するスケールアウトが可能である。
PostgreSQL 10 より、ロジカルレプリケーションを組み込みでサポートしている。データベース全体ではなく、指定した部分だけをレプリケーションできる。

全文検索

LIKE 述語と正規表現による文字列検索のほか、全文検索の機能を持つ。バージョン 8.3 以降は組み込みで、それ以前のバージョンでは contrib/tsearch2 として提供されている。この全文検索では文字列から単語を抽出し、転置テーブル (GIN) または単語空間を多次元木 (GiST) とするインデックスを作成できる。SQL/MM の全文検索とは異なり、「@@」演算子を使用する独自の文法で検索を行う。
SELECT * FROM テーブル WHERE to_tsvector(文字列カラム) @@ to_tsquery('検索クエリ')
標準では日本語の文字列から単語を抽出するパーサを持たないが、外部拡張である textsearch-ja を使用することで形態素解析による検索が可能となる。
また、標準の全文検索以外にも、PGroonga (Groonga を使用), Ludia, textsearch_senna (Senna を使用), pgestraier (Hyper Estraier), pgRast (Rast) などが外部拡張として存在する。

UPSERT機能

PostgreSQL 9.5 より、データの新規挿入または更新を行う「UPSERT」機能が実装された。「UPSERT」機能とは、データの新規挿入（INSERT）ができれば挿入を行い、新規挿入ができなければ更新（UPDATE）を行うもの。「ON CONFLICT」句を指定すると、データ変更の衝突を適切に処理できるという。

更新処理

過去のバージョンの PostgreSQL は他の関係データベース管理システム (RDBMS) と比較して更新処理が遅いと言われていた。追記型アーキテクチャが採用されており、更新処理は削除と挿入の組み合わせとして実現されていた。特に挿入の際にインデックスのキーを追加する必要がある点で性能差が生じていた。
しかし、バージョン 8.3 にて Heap-Only Tuples (HOT) と呼ばれる機能が採用され、インデックスのキーとなっている列の値に変更が無い場合にはインデックスの更新を回避できるようになった。HOT により約2倍のスループット向上が確認されている。

管理ツール

PostgreSQL専用もしくは各種データベース汎用のデータベース接続クライアントを利用して管理できる。

psql

psql は PostgreSQL 付属のコマンドライン・プログラムである。
SQL を直接入力またはファイルから読み込んで実行するほか、スキーマ情報の表示などのメタコマンドを持つ。
また、SQL 構文やテーブル名などをタブキーにより入力補完できる。

pgAdmin

pgAdmin は GUI の管理インタフェースである。
PostgreSQL License で配布される オープンソースソフトウェア (OSS) である。
多くのプラットフォームで動作し、日本語を含む多くの言語が利用できる。
また、専用の SQL エディタは psql と同様の入力補完機能を持つ。
Microsoft SQL Server Management Studio と似たインタフェースでデータベースを操作できる。

phpPgAdmin

phpPgAdminはウェブベースの管理ツールである。PHPで作られており GPL で配布されている。名称はphpMyAdminと似ているが、製品同士の関連性は無く、操作性はかなり異なる。