PostgreSQLとは

PostgreSQLは、オープンソースのオブジェクトリレーショナルデータベース管理システム(ORDBMS)。通常は、本番データベースとして使用されることもあれば分析データベースとして使用されることもあります。MySQLが拡張性とパフォーマンスを優先するのに対し、PostgresはSQLコンプライアンスと拡張性を優先します。​​​​​​​

Postgresを選んでいるユーザーは主にデータの完全性とカスタマイズのレベルを高く保ちたいと考えている組織。これは、PostgreSQLがACID完全準拠のトランザクションとカスタムプロシージャをサポートしているのが理由です。

他のオープンソースのトランザクションデータベースと異なり、PostgresはANSI SQLコンプライアンスも優先しているのが特徴で、高度な分析ワークロードにも対応する包括的なSQLライブラリと拡張型の機能を備えています。

Postgresは無料でダウンロードしてコモディティハードウェアにデプロイすることができるほか、各種ベンダーを通してクラウドで稼働させることも可能。機能が豊富であらゆるOLAPワークロードに合わせられていますが、データ量が数テラバイトを超えるとパフォーマンスが限界に達しやすくなります。​​​​​​​

PostgreSQLをデータベースとして選ぶ理由

拡張性

オブジェクトリレーショナルデータベースとしてのPostgresの大きなメリットは、アーキテクチャが拡張可能であること。これによって、データベース内の手順のカスタマイズ/自動化に使用できるユーザー定義関数とサードパーティライブラリへのサポートが可能になります。​​​​​​​

ANSIのSQL規格に適合

PostgreSQLのSQL構文は洗練されていて包括的であるため、OLAPワークロードでのPostgres運用を視野に入れている組織にとっては有用です。Postgresはこの記事作成時点でANSI-SQL: 2008規格に準拠しています。

高い同時実行性

Postgresではマルチバージョン同時実行制御が採用されており、ユーザーはロックをかけられることなく同じデータベースの書き込みと読み取りができるようになっています。

PostgreSQLが実際に役立つ事例

ユーザー主導でカスタマイズするストアドプロシージャ

オブジェクトリレーショナルデータベースとしてのPostgreSQLの強みに、ユーザーがストアドプロシージャと関数を比較的簡単に変更できるということです。作成したコードをそのままデータベースに追加できるため、プロトタイピングによるカスタム型プロシージャ/ワークフローを導入するうえでPostgreSQLは優れた選択肢になります。

豊富な機能​​​​

幅広い機能を好む組織にとってPostgresは、OracleやMSSQLなど人気の高い占有型リレーショナルデータベースに取って代わる優れたソリューションでもあります。その理由は、はるかに低い展開コスト。ただし、投じる金額によっては他のデータベースのサポートレベルがPostgresを上回る場合があります。

料金に関する考慮事項​​​​​​​

オープンソースのPostgreSQLは、ソフトウェアは無料でダウンロードできますが、ハードウェアをどう充てるかで運用コストの総額が大きく左右されるため注意が必要です。つまり、ディスクの容量、CPU、メモリが増えるとコストも高くなるわけです。また、自己ホスト型であるPostGreSQLソリューションを使用するにあたっては、サーバーのストレージと単独で受けるメンテナンスのコストも別途付随してきます。​​​​​​​

なかには、クラウドでPostgreSQLのインスタンスを管理することに関心をお持ちの組織もあることでしょう。Amazon Relational Database Serviceや、Google Cloud SQL、EnterpriseDB、Herokuなど、さまざまなクラウドベンダーがPostgreSQLのサービスを提供していますので検討が可能です。

データベースのアーキテクチャ

他のトランザクションデータベースとは異なりひとつのサーバーに実装されているPostgreSQLは、通常、ストレージ機能やコンピューティング機能を複数のノードに分散させる構造にはなっていません。クラスタリングや、レプリケーション、プーリングといった手法でPostgresクラスターを拡張しパフォーマンスを高めたり容量を増やしたりすることも可能ではありますが、こうした方法は複雑でそれほど一般的ではありません。多くの組織が採用しているのは、データベースを垂直方向に拡張してPostgresをアップサイズするという手段で、これは、より強力で大きなサーバーを購入することを意味します。​​​​​​​

PostgreSQLのアーキテクチャには、注目すべきユニークな特徴が2つあります。

オブジェクトリレーショナルデータベース管理システム

Postgresは、オブジェクトリレーショナルデータベース管理システム(ORDBMS)として分類されます。これは、従来のリレーショナルデータベース管理システム(RDBMS)とは異なり、Postgresのアーキテクチャがオブジェクト指向であることを意味します。​​​​​​​

RDBMSの大半は、テーブルなど、データベース内の実際のデータに関する情報を保存しますが、PostgresとはじめとするORDBMSでは、各種データ型やSQL関数等に関する情報など、RDBMSよりもはるかに多くの情報を保存します。特にPostgresにおいては、個々のユーザーがこうしたテーブルを編集して新しいデータ型を追加したり、あるいはSQL関数を追加してデータの保存方法やデータベースとのやり取りをカスタマイズしたりできます。

Postgresが拡張可能であるのはこうしたアーキテクチャによるもので、それゆえユーザーは、ソースコードをいじることなく、保存されたデータの新しい活用方法を試すことができるわけです。​​​​​​​

マルチバージョン同時実行制御

PostgreSQLのアーキテクチャのもうひとつの重要な強みは、同時実行性、つまりひとつのデータベースでデータの読み取りと書き込みが同時にできるようになっていることです。

他のトランザクションデータベースは、ひとつのデータベースでの読み取りと書き込みの同時実行はサポートしていません。というのは、書き込みをしている間に読み取りが生じた場合、ユーザーが更新の途中でデータを読み取る可能性があり、データベースからの読み取り結果が不正確になる恐れがあるからです。​​​​​​​

この問題を解決するため、MySQLなどのデータベースは、ストレージにデータが書き込まれている間データベースをロックするというポリシーを設けています。同じシステム上で書き込みと読み取りをしようと思えば、物理的にデータベースを複製しなければなりません。

その点Postgresでは、マルチバージョン同時実行制御(MVCC)と呼ばれるシステムを採用しており、データベース全体のスナップショットを一つひとつ効果的に取得して読み取りを行います。要するに、データがデータベースに読み込まれると、より新しいテーブルのスナップショットがキャプチャされ、それをユーザーが読み取るという仕組み。いわばロックフリーのデータベースシステムです。

データの種類

大半のトランザクションデータベースと同様、PostgreSQLのコアコンピテンシーはリレーショナルデータストレージにあります。その証拠に、Postgresは少量から中程度量のJSONデータの扱いに優れ、ネイティブJSON解析、さらにはHStoreを介したJSONインデックス作成もサポートしています。本来は列指向ストアではありませんが、列型ストレージを可能にする拡張機能もあり、オープンソースのPostgresではそれを無料で(ホストに応じて)利用することができます。

PostgreSQLがサポートしているデータ型はすべてここでご案内していますが、ユーザーが独自のデータ型を作成できるという点も見逃せません。

行の範囲(量)

PostgreSQLでは、ストレージのデータ量が数テラバイトになるとパフォーマンスに影響が出始めます。これには他のデータベースと同様、最適化によるさまざまな対処法があります。

しかし、可能な限りの最適化手法を試しても分析クエリの作成でインタラクティブな体験(応答時間にして、分単位ではなく秒単位)ができない場合は、OLAPクエリをMPPデータベースに移行する時期が来ている可能性がありますのでご検討をお勧めします。​​​​​​​

PostgreSQLを使う

PostgreSQLの導入

Postgresはオープンソースであるため、ローカルシステムに導入する際に必要なものはほとんどありません。参照できる資料にはPostgresのドキュメンテーション(非常に詳細)があるほか、各種オペレーティングシステム向けのガイドでも、Postgresのインストールについて分かりやすく説明されています。

ホスト型/クラウドのインスタンスにインストールする際は、アカウントを作成してAmazon AWSでクラスターを構築してください。​​​​​​​

注 - Postgresでは「postgres」というデフォルトのユーザー名が作成されますが、セキュリティ上、このユーザー名はデータベースソフトウェアにアクセスする以外の目的では使用しないでください。

新規データの処理

PostgreSQLでは、CREATEコマンドを使用してMySQLと同じ要領で簡単に新しいテーブルを作ることができます。​​​​​​​

Postgresは標準のINSERT関数を使用しており、これについてはMySQLと同じです。しかし、MySQLのようなREPLACE拡張機能はPostgresは使用しておらず、同様の操作を再現するためには少し面倒な作業が必要になります。

PostgresはPythonと非常に相性が良く、特にモジュールPython psycopg2モジュールを使用した場合は、INSERTUPDATEの操作をプログラムできるようになります。

メンテナンス

オンラインのリソースに、PostgreSQLのインスタンスのパフォーマンスの監視や調整に役立つものがたくさんあります。

インデックス

Postgresのパフォーマンスを左右する大きな要因のひとつとして、インスタンス内のテーブルに適切にインデックスを付けられるかどうかということがあります。インデックスは、データベースがデータを探すときに使用するもので、いわゆるデータベースの「目次」。本に目次があることですべてのページをめくらずに済むのと同じように、データベース内のインデックスも、データを見つけるためにデータベースのテーブルをフルスキャンする必要を防ぎます。​​​​​​​

「インデックスの適切な実践」を突き詰めると、大抵の場合、さまざまに異なるインデックスとそのそれぞれをいつどのように効果的に使用するかを理解すること、にたどり着きます。こちらの記事で、各種インデックスとその使用のタイミングについて詳しく説明されていますのでぜひご一読ください。

監視 / EXPLAINプラン

Postgresのパフォーマンスを効果的なものにするうえでは、パフォーマンスの高いSQLを記述することと、記述されたSQLをPostgresがどう解釈するか理解することも重要なポイントのひとつです。​​​​​​​

特定のSQLクエリに対するPostgresの解釈を理解するための最適な方法は、クエリでEXPLAINプランを実行することです。このPostgresのガイドでは、EXPLAINステートメントについて全体的にうまく説明されており、このガイドでは、その最も難しい部分が噛み砕かれてもう少し分かりやすく説明されています。

PostgreSQLに関する事実

  • MySQLからPostgresに移行するユーザーのなかには、Postgresに含まれるさまざまなクエリ機能に気付かない人がいます。こうした機能を使うとより高度な分析、より洗練されたクエリ記述が可能になることがあるというのに、残念です。
  • Postgresの命令規則は、MySQLとはデータ型が若干異なります。 MySQLとPostgresのデータ型の具体的な違いについては、こちらの表を確認してください。

アナリティクスを快適に

ビジネスインテリジェンス、ビッグデータ分析、顧客の360°ビュー。
Lookerはお客様のどんなニーズにもお応えします。当社のデータエキスパートにご相談ください。

デモをリクエスト