PostgreSQLの進化に迫る
PostgreSQLの成長
今回は、PostgreSQLの機能面や性能面がどのように進化、成長してきたかを紹介します。
PostgreSQLは、2001年ごろのバージョン7.1の時点で、前回記事で紹介した信頼性を確保するWALや、追記型アーキテクチャによる効率的なトランザクション制御の仕組みを備えていました。また、SQL言語としても、一通りの機能をサポートしていました。PostgreSQLは、ここからさらに成長していきます。
図1は、7.0以降の各バージョンのソースコード一式の総サイズ(ビルド前)に、各バージョンの主な拡張個所を付記したものです。およそ10年間の間にコード量が倍以上に成長しています。それでは、機能項目ごとにどのように拡張されているかを紹介していきます。
SQL言語の基本機能について
SQL言語としてのコア機能サポートは、バージョン7.1時点で、ビューや副問い合わせ、外部結合、カーソル、手続き言語(ストアドプロシージャ)、バイナリラージオブジェクトなどの機能を持ち、ほぼ一通りの完成をみています。
それ以降は、いくつかの欠けていた機能の追加や、SQL標準規格に合わすための構文の追加修正、プランナの改善などが行われています。
追加の基本機能としては、スキーマ定義対応(バージョン7.3)、カーソルでのデータ更新(バージョン8.3)への対応、「ALTER TABLE」など、データ定義構文の拡充などがあります。また、トランザクション処理関連では、SAVEPOINTのサポート(バージョン8.0)、二相コミットのサポート(バージョン8.2)などが追加されています。
特に近年、PostgreSQLは、しばしばSQL標準規格に合わす修正が適用されています。これにより後方互換性が失われるケースもありますが、もともとメジャーバージョンアップに際しては、データ移行はできても、前バージョンとのSQLコマンドの互換性はそれほど重視されません。この点は商用データベース製品と異なります。現在、PostgreSQLは「SQL:2003」規格のコア部分について、ほとんどをサポートしています。
SQLは、データを取得したり操作したりする条件を記述して、手順の詳細は指定しない言語です。PostgreSQLはコストベースのプランナを備えていて、SQLコマンドを実現するためのすべての方式(プラン)のコストを算出して、最も低コストの方式で処理を実行します。
このプランナ部分は商用データベース製品と比べ幾分見劣りしていて、SQL文の書き方に注意が必要でした。バージョン7.3から8.3くらいまでの数年で少しずつプランナが改善され、また、ビットマップインデックススキャンなど新たな検索方式が追加され、悪いプランが実行されてしまうケースは少なくなっています。