PostgreSQL
1986年 - カリフォルニア大学バークレー校 (UCB) でマイケル・ストーンブレーカーがPOSTGRESプロジェクトを発足。
1987年 - プロトタイプが完成、翌年のACM-SIGMODコンファレンスで紹介される。
1989年6月 - POSTGRES 1 を数名の外部ユーザーにリリース。
1990年6月 - POSTGRES 2 のリリース。前バージョンの批評をもとにルールシステムが再設計された。
1991年 - POSTGRES 3 のリリース。複数ストレージの管理機構追加等。
1993年 - POSTGRES 4.2 をもってカリフォルニア大学バークレー校におけるPOSTGRESプロジェクトが終了。
PostgreSQLのバージョンは以下のように表現される。
6.0〜9.6:「x.y.z」(x、y、zはそれぞれ整数) で表現される。「x.y」の部分がメジャーバージョン、「z」がマイナーバージョンである。
10以降:整数部がメジャーバージョンを表現する。「x.y」(x、yはそれぞれ整数) で表現され、「x」の部分がメジャーバージョン、「y」がアップデート番号である。
バキュームは多くのI/Oが必要なため、負荷の高い処理である。バキューム実行中のシステムの全体の性能悪化を防ぐため、バキュームを行う速度を制限する機能が追加された。ただし、バキューム自体の処理時間はその分多く要する。
多くのデータ型が利用できる。
数値型:整数、浮動小数点数、任意の精度を持つ数値、連番
通貨型
文字列:固定長、可変長
可変長バイト列
日時、日付、時刻、時間差分 (タイムゾーンの有無を指定可能)
ブーリアン型
列挙型(8.3以降)
幾何型:点、直線、線分、矩形、閉経路、開経路、多角形、円
ネットワークアドレス:IPv4 / IPv6 アドレス, MAC アドレス
ビット列
テキスト検索に関する型
UUID 型
XML 型
JSON 型:テキスト形式、バイナリ形式
配列型
複合型
範囲型
可変長文字列と可変長バイト列には最大で 1GB を格納できる。一定のサイズを上回るデータ値は TOAST と呼ばれる機能により自動的に圧縮され別領域に配置される。そのため、ページサイズ (通常8KB) を上回るサイズの行であっても保存できる。
さらに、ユーザがデータ型を追加することもでき、それに対してインデックスを作成することもできる。 利用例として、GIS 用の型を GiST インデックスで検索可能な PostGIS プロジェクトがある。
psql は PostgreSQL 付属のコマンドライン・プログラムである。 SQL を直接入力またはファイルから読み込んで実行するほか、スキーマ情報の表示などのメタコマンドを持つ。 また、SQL 構文やテーブル名などをタブキーにより入力補完できる。
LWLock (Lightweight lock) において、一部、スピンロックからアトミック命令に切り替え、また、共有バッファのマッピングのハッシュテーブルのパーティション数を16から128に増やすなどの改善により、並列度が32〜64あたりでのパフォーマンスを改善した。
関数(ストアドファンクション)によりサーバで実行される処理のまとまりを定義できる。PostgreSQL は行を返却する関数を定義することができる。関数の出力は複数の行であり、クエリの中でテーブルと同様に扱うことができる。実行するユーザまたは定義したユーザのどちらの権限で実行されるかを指定して関数を定義できる。
関数の定義には SQL の他、分岐やループをサポートする下記の言語で実装することが可能である。言語によっては関数をデータベーストリガとして実行することもできる。
PostgreSQL は組み込みで以下のインデックスをサポートしている。デフォルトはB+木。また、ユーザ定義インデックスを追加することもできる。
B+木
ハッシュテーブル
GiST (汎用検索ツリー, 多次元木)
SP-GiST (Space-Partitioned GiST)
GIN (汎用転置インデックス)
BRIN (Block Range INdex)
PostgreSQL のインデックスには以下の特徴がある。
必要に応じて逆順でスキャンできる。逆順スキャン用のインデックスを別に定義する必要は無い。
式インデックス (関数インデックス) を定義できる。複数の列の値を引数に取る関数の結果をインデックス化する。
部分インデックス (条件付きインデックス) を定義できる。条件を指定し、条件に適合する行のみをインデックス化することで、インデックスのサイズを縮小できる。
クエリオプティマイザ (planner) は複数のインデックスを同時に使用するクエリ実行計画を作成できる。複数のインデックスの結果をメモリ上のビットマップとして併せ、そのビットマップに対応する行をテーブルから取得する。