| PostgreSQL | |
|---|---|
世界で最も先進的なオープンソースリレーショナルデータベース[ 1 ] | |
| 開発者 | PostgreSQLグローバル開発グループ[ 2 ] |
| 初回リリース | 1996年7月8日[ 3 ] (1996年7月8日) |
| 安定版リリース | 18.1 [ 4 ] |
| リポジトリ | |
| 言語 | C(LLVM依存の場合はC++) |
| タイプ | RDBMS |
| ライセンス | PostgreSQLライセンス(無料、オープンソース、寛容型)[ 5 ] [ 6 ] [ 7 ] |
| ウェブサイト | www.postgresql.org |
| 発行者 | PostgreSQLグローバル開発グループカリフォルニア大学評議員 |
|---|---|
| Debian FSG互換 | はい[ 8 ] [ 9 ] |
| FSF承認 | はい[ 10 ] |
| OSI承認 | はい[ 7 ] |
| GPL互換 | はい |
| コピーレフト | いいえ |
| 異なるライセンスのコードからのリンク | はい |
| ウェブサイト | postgresql |
| この記事は構造化クエリ言語に関するシリーズの一部です。 |
PostgreSQL ,( / ˌ p oʊ s t ɡ r ɛ s k j u ˈ ɛ l /ⓘ POHST -gres-kew- EL)、 [ 11 ] [ 12 ]としても知られるPostgreSQLは、拡張性とSQL無料のオープンソースリレーショナルデータベース管理システム(RDBMS)。 PostgreSQLは、原子性、一貫独立性、永続性(ACIDを備えたトランザクション、自動更新可能なビュー、マテリアライズドビュー、トリガー、外部キー、ストアドプロシージャを。 [ 13 ] Windows、Linux、macOS、 FreeBSD、OpenBSDなどの 主要なオペレーティングシステムデータウェアハウス、データレイク、 [ 14 ]または多くの同時ユーザーWebサービスまで、さまざまなワークロードを処理します。
PostgreSQL グローバル開発グループは、データベース エンジンおよびそれに密接に関連するコンポーネントの開発のみに焦点を当てています。技術的には、このコアは PostgreSQL 自体を構成するものですが、従来はプロプライエタリ ソフトウェアベンダーによって提供されていたその他の重要な機能セットを提供する大規模な開発者コミュニティとエコシステムが存在します。これらには、地理空間[ 15 ]または時間[ 16 ]データベースのサポートに必要な機能や、他のデータベース製品をエミュレートする機能など、 特殊な用途のデータベース エンジン機能が含まれます。 [ 17 ] [ 18 ] [ 19 ] [ 20 ]また、グラフィカル ユーザー インターフェイス[ 21 ] [ 22 ] [ 23 ]や負荷分散および高可用性ツールセット[ 24 ]など、さまざまなユーザー インターフェイスおよびマシン インターフェイス機能もサードパーティから提供されています。 PostgreSQL 開発グループの一部ではないものの、人、会社、製品、プロジェクトからなる大規模なサードパーティ PostgreSQL サポート ネットワークは、PostgreSQL データベース エンジンの採用と使用に不可欠であり、PostgreSQL エコシステム全体を構成しています。[ 25 ]
PostgreSQLは元々 、カリフォルニア大学バークレー校で開発されたIngresデータベースの後継として誕生したことから、POSTGRESという名前でした。[ 26 ] [ 27 ] 1996年、 SQLをサポートしていることを反映して、プロジェクト名はPostgreSQL
に変更されました。2007年のレビューの後、開発チームはPostgreSQLという名称とPostgresという別名を維持することを決定しました。[ 28 ]
PostgreSQLは、カリフォルニア大学バークレー校のIngresプロジェクトから発展しました。1982年、IngresチームのリーダーであるMichael Stonebrakerは、Ingresの独自バージョンを作成するためにバークレー校を離れました。[ 26 ]彼は1985年にバークレーに戻り、1980年代初頭にますます明らかになった現代のデータベースシステムの問題点に対処するためのポストIngresプロジェクトを開始しました。彼はこれらのプロジェクトやその他のプロジェクト、[ 29 ]、そしてそれらで開拓された技術により、 2014年にチューリング賞を受賞しました
新しいプロジェクトであるPOSTGRESは、データ型を完全にサポートするために必要な最小限の機能を追加することを目指しました。[ 30 ]これらの機能には、型の定義と関係性の完全な記述機能が含まれていました。これらは広く使用されていますが、完全にユーザーが管理するものでした。POSTGRESでは、データベースは関係性を理解し、ルールを使用して関連するテーブル内の情報を自然な方法で取得できました。POSTGRESはIngresのアイデアを多く採用していましたが、コードは採用していませんでした。[ 31 ]
1986年から、システムの基礎を説明した論文が発表され、プロトタイプ版は1988年のACM SIGMODカンファレンスで発表されました。チームは1989年6月にバージョン1を少数のユーザーにリリースし、続いて1990年6月にルールシステムを書き直したバージョン2をリリースしました。1991年にリリースされたバージョン3では、再びルールシステムを書き直し、複数のストレージマネージャーのサポート[ 32 ]と改善されたクエリエンジンが追加されました。1993年までには、ユーザー数が増え、サポートと機能を求めるリクエストがプロジェクトに殺到し始めました。1994年6月30日にバージョン4.2 [ 33 ]をリリースした後(主にクリーンアップ)、プロジェクトは終了しました。バークレーはPOSTGRESをMITライセンスのバリエーションでリリースし、他の開発者がコードを自由に使用できるようにしました。当時、POSTGRES は Ingres の影響を受けたPOSTQUEL クエリ言語インタープリタを使用していました。これは、という名前のコンソール アプリケーションで対話的に使用できましたmonitor。
1994年、バークレー大学の大学院生アンドリュー・ユーとジョリー・チェンは、POSTQUELクエリ言語インタープリタをSQLクエリ言語のインタープリタに置き換え、Postgres95を開発しました。monitorコンソールも置き換えられましたpsql。ユーとチェンは1995年5月5日に最初のバージョン(0.01)をベータテスターに発表しました。Postgres95のバージョン1.0は、ソフトウェアを自由に変更できるより自由なライセンスで、1995年9月5日に発表されました
1996年7月8日、Hub.org Networking ServicesのMarc Fournierは、オープンソース開発活動のために、大学以外で最初の開発サーバーを提供しました。[ 3 ] Bruce MomjianとVadim B. Mikheevの参加により、バークレーから引き継いだコードを安定化させる作業が開始されました。
1996年、SQLをサポートしていることを反映して、プロジェクト名がPostgreSQLに変更されました。ウェブサイトPostgreSQL.orgでのオンライン公開は、1996年10月22日に開始されました。[ 34 ] PostgreSQLの最初のリリースは、1997年1月29日にバージョン6.0としてリリースされました。それ以来、世界中の開発者とボランティアがPostgreSQLグローバル開発グループとしてソフトウェアのメンテナンスを行っています。[ 2 ]
このプロジェクトは、フリーでオープンソースのソフトウェアであるPostgreSQLライセンスに基づいてリリースを提供し続けています。コードは、プロプライエタリベンダー、サポート企業、そしてオープンソースプログラマーからの貢献によって提供されています。
2025年現在、PostgreSQLはメジャーリリースバージョン18であり、非同期I/O(AIO)を実装していることで注目に値します。これにより、データベースユーザーは先読みやシーケンシャルスキャンなどの同時I/Oタスクを実行できるようになります。[ 35 ]
PostgreSQLは、多版型同時実行制御(MVCC)によって同時実行性を管理します。MVCCは各トランザクションにデータベースの「スナップショット」を提供し、他のトランザクションに影響を与えることなく変更を加えることを可能にします。これにより、読み取りロックの必要性が大幅に軽減され、データベースがACID原則を維持することが保証されます。PostgreSQLは、Read Uncommitted、Read Committed、Repeatable Read、Serializableの4つのトランザクション分離レベルを提供します。PostgreSQLはダーティリードの影響を受けないため、Read Uncommittedトランザクション分離レベルを要求すると、代わりにRead commitedが提供されます。PostgreSQLは、Serializable Snapshot isolation (SSI)方式によって完全な直列化可能性をサポートしています。[ 36 ] PostgreSQLのMVCC実装は、既存の行を更新する書き込み負荷が高い場合、パフォーマンス上の問題が発生しやすく、チューニングが必要になります。[ 37 ]
PostgreSQLには、変更(先行書き込みログ(WAL))をレプリカノードに非同期に送信するバイナリレプリケーションが組み込まれており、これらのレプリケートされたノードに対して読み取り専用クエリを実行する機能があります。これにより、読み取りトラフィックを複数のノード間で効率的に分割できます。同様の読み取りスケーリングを可能にした以前のレプリケーションソフトウェアは、通常、マスターにレプリケーショントリガーを追加することに依存しており、負荷が増加していました
PostgreSQLには同期レプリケーション[ 38 ]が組み込まれており、書き込みトランザクションごとに、マスターは少なくとも1つのレプリカノードがトランザクションログにデータを書き込むまで待機します。他のデータベースシステムとは異なり、トランザクションの永続性(非同期か同期か)は、データベースごと、ユーザーごと、セッションごと、さらにはトランザクションごとに指定できます。これは、そのような保証を必要としないワークロードには役立ちますが、同期スタンバイへのトランザクション到達の確認が必要となるためパフォーマンスが低下するため、すべてのデータに適用する必要はないかもしれません。
スタンバイサーバーは同期または非同期にすることができます。同期スタンバイサーバーは設定で指定でき、同期レプリケーションの候補となるサーバーを決定します。リストの先頭でアクティブにストリーミングしているサーバーが現在の同期サーバーとして使用されます。このサーバーに障害が発生した場合、システムは次のサーバーにフェイルオーバーします。
PostgreSQLのレプリケーションは、プライマリサーバとスタンバイサーバの間で競合を引き起こす可能性があります。特に、実行中のクエリがアクセスしているにもかかわらず、スタンバイサーバからタプルが早期に削除された場合にその可能性が高くなります。[ 39 ]これに対処するために、PostgreSQLにはフィードバックフラグ[ 40 ]が含まれており、スタンバイサーバは進行中のクエリをプライマリサーバに積極的に通知して、この種の競合を軽減します。
同期マルチマスターレプリケーションはPostgreSQLコアには含まれていません。PostgreSQLをベースにしたPostgres-XCは、スケーラブルな同期マルチマスターレプリケーションを提供します。[ 41 ] PostgreSQLと同じライセンスで提供されています。関連プロジェクトとしてPostgres-XLがあります。Postgres-Rもまた別のフォークです。[ 42 ]双方向レプリケーション(BDR)は、PostgreSQL用の非同期マルチマスターレプリケーションシステムです。[ 43 ]
repmgr などのツールを使用すると、レプリケーション クラスターの管理が容易になります。
非同期トリガーベースのレプリケーションパッケージが複数利用可能です。これらは、拡張コア機能の導入後も、データベースクラスタ全体のバイナリレプリケーションが適切でない状況で役立ちます。
PostgreSQLには、通常のB木インデックスとハッシュテーブルインデックス、そして4つのインデックスアクセスメソッド(一般化検索木(GiST)、一般化転置インデックス(GIN)、空間分割GiST(SP-GiST)[ 45 ]、ブロック範囲インデックス(BRIN))が組み込まれています。さらに、ユーザー定義のインデックスメソッドを作成することもできますが、これはかなり複雑なプロセスです。PostgreSQLのインデックスは、以下の機能もサポートしています
PostgreSQLスキーマは名前空間であり、同じ種類と名前のオブジェクトを単一のデータベース内に共存させることができます。 データベーススキーマとは、各テーブルのデータが他のテーブル内のデータとどのように関連するかを定義する抽象的、構造的、組織的な仕様です。ロールやテーブルスペースなどの一部のグローバルオブジェクトを除くすべてのPostgreSQLデータベースオブジェクトは、スキーマ内に存在します。スキーマはネストできず、スキーマにスキーマを含めることはできません。権限システムによって、スキーマとそのコンテンツへのアクセスが制御されます。デフォルトでは、新しく作成されたデータベースにはpublicという単一のスキーマしかありませんが、他のスキーマを追加することができ、publicスキーマは必須ではありません
設定search_pathにより、PostgreSQLが非修飾オブジェクト(プレフィックス付きスキーマを持たないオブジェクト)のスキーマをチェックする順序が決まります。デフォルトでは$user, public($user現在接続中のデータベースユーザーを参照)に設定されています。このデフォルトはデータベースレベルまたはロールレベルで設定できますが、セッションパラメータであるため、クライアントセッション中に自由に(複数回でも)変更でき、そのセッションのみに影響します。
search_path にリストされている存在しないスキーマ、またはログインしているユーザーがアクセスできないその他のスキーマは、オブジェクトの検索中に黙ってスキップされます。
新しいオブジェクトは、search_path で最初に表示される有効なスキーマ (アクセス可能なスキーマ) に作成されます。
以下のような幅広いネイティブデータ型がサポートされています
さらに、ユーザーは独自のデータ型を作成することができ、通常はPostgreSQLのインデックス基盤(GiST、GIN、SP-GiST)を介して完全にインデックス化できます。これらの例としては、 PostgreSQLのPostGISプロジェクトの地理情報システム(GIS)データ型が挙げられます。
ドメインと呼ばれるデータ型もあります。これは他のデータ型と同じですが、ドメインの作成者によって定義されたオプションの制約が付加されます。つまり、このドメインを使用して列に入力されたデータは、ドメインの一部として定義された制約に従う必要があります。
データの範囲を表すデータ型、いわゆる範囲型を使用できます。範囲型は、離散的な範囲(例:1から10までのすべての整数値)または連続的な範囲(例:午前10時から午前11時までの任意の時間)に対応しています。組み込みの範囲型には、整数、大整数、小数、タイムスタンプ(タイムゾーン付きとなし)、日付の範囲が含まれます。
カスタム範囲型を作成することで、inet 型をベースとした IP アドレス範囲や、float データ型をベースとした float 範囲など、新しい種類の範囲を作成できます。範囲型は、それぞれ[]と の文字を使用して、包含範囲と排他範囲の境界をサポートします。(例:は 4 から 9 までのすべての整数を表します。) 範囲型は、重複、包含、右辺などのチェックに使用される既存の演算子とも互換性があります。 ()[4,9)
データベース内のほぼすべてのオブジェクトの新しいタイプを作成できます。これには以下が含まれます
テーブルは、親テーブルから特性を継承するように設定できます。ONLYキーワード(つまり、親テーブルからデータを選択しない限り)を使用して子テーブルのデータは親テーブルに存在するように見えます。親テーブルに列を追加すると、その列が子テーブルに表示されます SELECT*FROMONLYparent_table;
継承を使用すると、トリガーまたはルールを使用して親テーブルへの挿入を適切な子テーブルに直接送信し、テーブルパーティションを実装できます。
この機能は完全にはサポートされていません。特に、テーブル制約は現在継承できません。親テーブルのすべてのチェック制約と非NULL制約は、子テーブルに自動的に継承されます。その他の種類の制約(一意制約、主キー制約、外部キー制約)は継承されません。
継承は、エンティティ関係図(ERD) に描かれた一般化階層の機能を PostgreSQL データベースに直接 マッピングする方法を提供します。
PostgreSQLは、外部データラッパー(FDW)を介して他のシステムにリンクし、データを取得できます。[ 49 ]これらは、ファイルシステム、他のリレーショナルデータベース管理システム(RDBMS)、Webサービスなど、 あらゆるデータソースの形式を取ることができます。つまり、通常のデータベースクエリでは、これらのデータソースを通常のテーブルのように使用でき、複数のデータソースを結合することさえできます
PostgreSQLは、アプリケーションがデータベースサーバーに接続できるようにするバイナリ通信プロトコルをサポートしています。このプロトコルはバージョン管理されており(PostgreSQL 7.4時点では3.0)、詳細な仕様が定められています。[ 50 ]
この通信プロトコルの公式クライアント実装はC APIであるlibpqです。[ 51 ]さらに、公式にサポートされているECPGツールを使用すると、SQLコマンドをCコードに埋め込むことができます。[ 52 ]どちらも標準のPostgreSQLディストリビューションの一部です。[ 53 ]
PostgreSQLに接続するためのサードパーティライブラリは、 C ++、[ 54 ] Java、[ 55 ] Julia、[ 56 ] [57 ] [ 58 ] Python、[ 59 ] Node.js、[ 60 ] Go、[ 61 ] Rustなど、多くのプログラミング言語で利用可能です。[ 62 ]
手続き型言語を使用すると、開発者はカスタムサブルーチン(関数)(ストアドプロシージャと呼ばれることが多い)を使用してデータベースを拡張できます。これらの関数は、データベーストリガー(特定のデータの変更時に呼び出される関数)やカスタムデータ型、集計関数の構築に使用できます。[ 63 ]手続き型言語は、関数を定義せずにSQLレベルのDOコマンドを使用して呼び出すこともできます。[ 64 ]
言語は2つのグループに分けられます。安全な言語で書かれた手続きはサンドボックス化されており、どのユーザーでも安全に作成・使用できます。安全でない言語で書かれた手続きは、データベースのセキュリティ制限を回避できる一方で、データベース外部のソースにアクセスできるため、スーパーユーザーのみが作成できます。Perlなどの一部の言語では、安全なバージョンと安全でないバージョンの両方が提供されています。
PostgreSQL には、次の 3 つの手続き型言語のサポートが組み込まれています。
さらに、PostgreSQLでは拡張機能を通じて手続き型言語をデータベースにロードすることができます。PostgreSQLにはPerl、Tcl、Pythonをサポートする3つの言語拡張機能が含まれています。Pythonについては現在のPython 3が使用され、廃止されたPython 2はPostgreSQL 15でサポートされなくなりました。以前は両方ともサポートされていましたが、デフォルトでPython 2が使用され、古いバージョンと新しいバージョンを同じセッションで使用することはできませんでした。[ 65 ]外部プロジェクトでは他の多くの言語のサポートが提供されており、[ 66 ] PL/ Java、JavaScript(PL/V8)、PL/ Julia、[ 58 ] PL/ R、[ 67 ] PL/ Rubyなどが含まれます。
トリガーは、SQLデータ操作言語(DML)文のアクションによって起動されるイベントです。例えば、INSERT文は、文の値が有効かどうかをチェックするトリガーを起動する場合があります。ほとんどのトリガーは、INSERT文またはUPDATE文の いずれかによってのみ起動されます。
トリガーは完全にサポートされており、テーブルにアタッチできます。トリガーは列ごとに設定でき、条件付きトリガーも可能です。つまり、UPDATEトリガーはテーブルの特定の列をターゲットにでき、トリガーのWHERE句で指定された条件セットに基づいてトリガーを実行することができます。INSTEAD OF条件を使用して、トリガーをビューにアタッチできます。複数のトリガーはアルファベット順に実行されます。トリガーは、ネイティブのPL/pgSQLで記述された関数を呼び出すだけでなく、PL/PythonやPL/Perlなどの他の言語で記述された関数も呼び出すことができます。
PostgreSQLは、NOTIFY、LISTEN、UNLISTENコマンドを介してアクセスできる非同期メッセージングシステムを提供しています。セッションは、特定のイベントが発生したことを示すために、ユーザ指定のチャネルとオプションのペイロードとともにNOTIFYコマンドを発行できます。他のセッションは、特定のチャネルをリッスンできるLISTENコマンドを発行することで、これらのイベントを検出できます。この機能は、テーブルが更新されたことを他のセッションに知らせたり、別のアプリケーションが特定のアクションが実行されたことを検出したりするなど、さまざまな目的に使用できます。このようなシステムにより、アプリケーションが何かが変更されたかどうかを確認するために継続的にポーリングする必要がなくなり、不要なオーバーヘッドが削減されます。通知は完全にトランザクション化されており、メッセージは送信元のトランザクションがコミットされるまで送信されません。これにより、実行中のアクションに対してメッセージが送信され、その後ロールバックされるという問題が解消されます
PostgreSQL の多くのコネクタ (libpq、JDBC、Npgsql、psycopg、node.js など) はこの通知システムをサポートしているため、外部アプリケーションで使用できます。
PostgreSQLはLISTENとFOR UPDATE SKIP LOCKEDを組み合わせることで、効率的で永続的な「pub/sub」サーバーまたはジョブサーバーとして機能することができます。 [ 68 ] [ 69 ] [ 70 ]
ルールは、入力クエリの「クエリツリー」を書き換えることを可能にします。ルールは、自動的に呼び出されるSQLのマクロ言語です。「クエリ書き換えルール」はテーブル/クラスに添付され、入力されたDML(選択、挿入、更新、および/または削除)を1つ以上のクエリに「書き換え」ます。このクエリは、元のDML文を置き換えるか、それに加えて実行されます。クエリ書き換えは、DML文の解析後、クエリプランニングの前に行われます
ルールが提供する機能は、後に新しいタイプのトリガーが導入されたことで、ほぼすべての点で複製されました。トリガーの使用は通常、ルールよりも好まれます。これは、同等のルールを使用するよりも、トリガーの動作と相互作用について推論しやすいためです。
PostgreSQLサーバーはプロセスベース(スレッドベースではない)であり、データベースセッションごとに1つのオペレーティングシステムプロセスを使用します。複数のセッションは、オペレーティングシステムによって利用可能なすべてのCPUに自動的に分散されます。多くの種類のクエリは、複数のCPUまたはコアを活用して、複数のバックグラウンドワーカープロセス間で並列化することもできます。[ 77 ]クライアントアプリケーションはスレッドを使用し、各スレッドから複数のデータベース接続を作成できます。[ 78 ]
PostgreSQLは、内部セキュリティをロールごとに管理します。ロールは通常、ユーザー(ログイン可能なロール)またはグループ(他のロールがメンバーであるロール)と見なされます。権限は、列レベルに至るまで、あらゆるオブジェクトに対して付与または取り消しすることができ、データベース、スキーマ、テーブル、行レベル でのオブジェクトの表示/作成/変更/削除を許可または禁止できます
PostgreSQLのSECURITY LABEL機能(SQL標準の拡張)は、 Security-Enhanced Linux (SELinux)セキュリティポリシーに基づいたラベルベースの強制アクセス制御(MAC)をサポートするバンドルされたロード可能なモジュールを使用して、追加のセキュリティを可能にします。[ 79 ] [ 80 ]
PostgreSQL は、次のような幅広い外部認証メカニズムをネイティブにサポートしています。
GSSAPI、SSPI、Kerberos、peer、ident、および certificate メソッドでは、認証システムによって一致したユーザーが特定のデータベース ユーザーとして接続できるかどうかをリストする指定された「マップ」ファイルも使用できます。
これらの方法は、クラスタのホストベース認証構成ファイル(pg_hba.conf)で指定され、許可される接続の種類を決定します。これにより、どのユーザーがどのデータベースに接続できるか、どこから接続できるか(IPアドレス、IPアドレス範囲、ドメインソケット)、どの認証システムを適用するか、接続にトランスポート層セキュリティ(TLS)を使用する必要があるかどうかを制御できます。
PostgreSQLは最新のSQL標準に高度に準拠していると主張していますが、完全ではありません(「2024年9月のバージョン17リリース時点で、PostgreSQLはSQL:2023 Core準拠の177の必須機能のうち少なくとも170に準拠しています」。他のデータベースで完全に準拠しているものはありません[ 82 ])。1つの例外は、テーブル名や列名などの引用符で囲まれていない識別子の処理です。PostgreSQLでは、内部的に小文字に変換されます[ 83 ]が、標準では引用符で囲まれていない識別子は大文字に変換する必要があるとされています。したがって、標準によれば、はnotFooと同等になるはずです。その他の欠点としては、トランザクション中に行のバージョンを自動的にログに記録し、時間内に参照できる可能性のあるテンポラルテーブルが存在しないことが挙げられます(FOR SYSTEM TIME述語)。ただし、比較的SQLに準拠したサードパーティ製の拡張機能は利用可能です[ 16 ]FOOfoo
このセクションは更新が必要です。理由:9年前のソフトウェアおよびハードウェアに基づくパフォーマンス情報は基本的に役に立たないためです。(2024年4月) |
PostgreSQLの非公式な性能研究は数多く行われてきました。[ 84 ]スケーラビリティ向上を目的とした性能改善は、バージョン8.1から本格的に開始されました。バージョン8.0とバージョン8.4の簡単なベンチマークでは、後者は読み取り専用ワークロードで10倍以上、読み取りと書き込みの両方のワークロードで少なくとも7.5倍高速であることが示されました。[ 85 ]
最初の業界標準でピア検証されたベンチマークは、2007年6月に、Sun Java System Application Server(GlassFishの独自バージョン)9.0 Platform Edition、UltraSPARC T1ベースのSun Fireサーバー、PostgreSQL 8.2を使用して実施されました。[ 86 ] SPECjAppServer2004 JOPS@Standardの778.14という結果は、 ItaniumベースのHP-UXシステムでOracle 10を使用した場合の874 JOPS@Standardと比較して遜色ありません。[ 84 ]
2007年8月、サンはSPECjAppServer2004 JOPS@Standardのベンチマークスコアを813.73に向上させました。テスト対象システムの価格が引き下げられたことで、価格性能比は84.98ドル/JOPSから70.57ドル/JOPSに向上しました。[ 87 ]
PostgreSQLのデフォルト設定では、データベースブロックのキャッシュやソートなど、パフォーマンスが重要な用途に少量の専用メモリしか使用しません。この制限は主に、古いオペレーティングシステムでは大きな共有メモリブロックを割り当てるためにカーネルの変更が必要だったためです。[ 88 ] PostgreSQL.orgは、 Wikiで基本的な推奨パフォーマンスプラクティスに関するアドバイスを提供しています。[ 89 ]
2012年4月、EnterpriseDBのRobert Haas氏は、64コアのサーバーを使用してPostgreSQL 9.2の線形CPUスケーラビリティを実証しました。[ 90 ]
Matloob Khushi氏は、PostgreSQL 9.0とMySQL 5.6.15のゲノムデータ処理能力についてベンチマークテストを実施しました。彼のパフォーマンス分析では、ランダムなヒトDNA領域を形成する80,000個のデータセット2つを用いて、PostgreSQLが重複ゲノム領域をMySQLの8倍高速に抽出できることが分かりました。PostgreSQLでは、データの挿入とアップロードも高速でしたが、両データベースの一般的な検索能力はほぼ同等でした。[ 91 ]
PostgreSQLは、以下のオペレーティングシステムで利用可能です: Linux (最近のすべてのディストリビューション)、macOSバージョン10.14以降で利用可能でテスト済みの64ビットARMおよびx86-64インストーラー、 [ 92 ] Windows (64ビットWindows Server 2022および2016用のインストーラーが利用可能でテスト済み[ 93 ] )、 FreeBSD、OpenBSD、[ 94 ] NetBSD、DragonFlyBSD、および公式の(非公式ではあるがおそらく利用可能な)バイナリ実行ファイルがないもの、Solaris、[ 95 ]およびillumos。
PostgreSQLは、以下の命令セットアーキテクチャ(およびオペレーティングシステム)で動作することが期待できます。Windowsおよびその他のオペレーティングシステム上の64ビットx86-64および32ビットx86。Windows以外では、64ビットARM [ 96 ]および古い32ビットARM ( Raspberry PiのARMv6などを含む[ 97 ])、RISC-V、z/Architecture、S/390、PowerPC(64ビットPower ISAを含む)、SPARC(これも64ビット)、MIPS、PA-RISCがサポートされています。他のプラットフォームでも動作することが知られています(ただし、最新バージョンでは何年もテストされていません)。[ 98 ]
PostgreSQLを管理するためのオープンソースのフロントエンドとツールには以下が含まれます
| psqlセッションの例[ 99 ] |
|---|
regression=# select foo ;エラー: 列 "foo" が存在しませんコンテキスト: PL/pgSQL 関数 "test1" で戻り値を関数の戻り値の型にキャストしています 行1: select foo; ^ regression=# \qpeter@localhost testdb=> \a \t \x出力形式は整列しています。タプルのみはオフです。拡張表示はオンです。regression=# select '\x' ;警告: 文字列リテラルでのエスケープの非標準使用1行目: select '\x'; ^ヒント: エスケープにはエスケープ文字列構文を使用してください。例: E'\r\n'。?column? ---------- x (1 row)回帰=# E '\x'を選択します。piro=> \set foo 30; piro=> select * from test where foo <= :foo ; foo | bar -----+----- 10 | 20 | (2 行)testdb=> \set foo 'my_table' testdb=> SELECT * FROM :"foo" ;testdb=> \set content `cat my_file.txt` testdb=> my_tableにINSERT INTO VALUES ( :'content' );回帰=# select (回帰(# 1 ); ?列? ---------- 1 (1 行)piro=> select ( piro(> ' piro'> ' || $$ piro$> $$ ) piro-> from " piro"> foo" ;エラー: リレーション " foo" が存在しません 5 行目: from " ^testdb=> CREATE TABLE my_table (最初の整数NULL以外デフォルト0 、2番目のテキスト) ; -- コマンドの終了CREATE TABLE=# SELECT '0x10' :: mpz AS "hex" , '10' :: mpz AS "dec" , -# '010' :: mpz AS oct , '0b10' :: mpz AS bin ; -- テーブル出力hex | dec | oct | bin -----+-----+-----+----- 16 | 10 | 8 | 2 (1 行)regression=# select schemaname from pg_tables limit 3 ; -- 1つのフィールド出力schemaname ------------ pg_catalog pg_catalog pg_catalog (3行)=# 10.0、1e - 6、1E + 6を選択; ?column? | ?column? | ?column? ----------+----------+---------- 10.0 | 0.000001 | 1000000 (1 行)regression=# begin ; BEGIN regression=# create table asdf ( foo serial primary key ); NOTICE: CREATE TABLE は、シリアル列 "asdf.foo" に暗黙的なシーケンス "asdf_foo_seq" を作成します。NOTE : CREATE TABLE / PRIMARY KEY は、テーブル "asdf" に暗黙的なインデックス "asdf_pkey" を作成します。CREATE TABLE regression=# insert into asdf values ( 10 )は、fooを返します。foo ----- 10 (1 row)INSERT 0 1回帰=# ROLLBACK ; ROLLBACK |
psqlコマンドラインプログラムです。これを使用して、SQLクエリを直接入力したり、ファイルから実行したりできます。さらに、psqlは、スクリプトの作成やさまざまなタスクの自動化を容易にするための、多数のメタコマンドとシェルのような機能を提供します。たとえば、オブジェクト名やSQL構文のタブ補完などです多くの企業がPostgreSQL用のプロプライエタリツールを提供しています。これらのツールの多くは、様々なデータベース製品に適応したユニバーサルコアで構成されています。これらのツールは、管理機能の大部分はオープンソースツールと共通ですが、データモデリング、インポート、エクスポート、レポート作成などの機能が向上しています。
PostgreSQLを主要データベースとして使用している著名な組織や製品には、以下のものがあります
いくつかの著名なベンダーは、 PostgreSQLをサービスとしてのソフトウェアとして提供しています
| リリース | 初回リリース | 最新マイナーバージョン | 最新リリース | サポート終了[ 162 ] | マイルストーン |
|---|---|---|---|---|---|
| 6.0 | 1997年1月29日 | 該当なし | 該当なし | 該当なし | PostgreSQLの最初の正式リリース、ユニークインデックス、pg_dumpallユーティリティ、ident認証 |
| 6.1 | 1997年6月8日 | サポート対象外:6.1.1 | 1997年7月22日 | 該当なし | 複数列インデックス、シーケンス、moneyデータ型、GEQO(GEnetic Query Optimizer) |
| 6.2 | 1997年10月2日 | サポート対象外:6.2.1 | 1997年10月17日 | 該当なし | JDBCインターフェース、トリガー、サーバープログラミングインターフェース、制約 |
| 6.3 | 1998年3月1日 | サポート対象外:6.3.2 | 1998年4月7日 | 2003年3月1日 | SQL-92 サブセレクト機能、PL/pgTCL |
| 6.4 | 1998年10月30日 | サポート対象外:6.4.2 | 1998年12月20日 | 2003年10月30日 | VIEW(読み取り専用)とRULE、PL/pgSQL |
| 6.5 | 1999年6月9日 | サポート対象外:6.5.3 | 1999年10月13日 | 2004年6月9日 | MVCC、一時テーブル、より多くの SQL ステートメントのサポート (CASE、INTERSECT、EXCEPT) |
| 7.0 | 2000年5月8日 | サポート対象外:7.0.3 | 2000年11月11日 | 2004年5月8日 | 外部キー、結合のSQL-92構文 |
| 7.1 | 2001年4月13日 | サポート対象外:7.1.3 | 2001年8月15日 | 2006年4月13日 | 先行書き込みログ、外部結合 |
| 7.2 | 2002年2月4日 | サポート対象外:7.2.8 | 2005年5月9日 | 2007年2月4日 | PL/Python、OIDは不要になり、メッセージの 国際化 |
| 7.3 | 2002年11月27日 | サポート対象外:7.3.21 | 2008年1月7日 | 2007年11月27日 | スキーマ、テーブル関数、準備済みクエリ[ 163 ] |
| 7.4 | 2003年11月17日 | サポート対象外:7.4.30 | 2010年10月4日 | 2010年10月1日 | JOINとデータウェアハウス関数の最適化[ 164 ] |
| 8.0 | 2005年1月19日 | サポート対象外:8.0.26 | 2010年10月4日 | 2010年10月1日 | Microsoft Windows上のネイティブサーバー、セーブポイント、表領域、ポイントインタイムリカバリ[ 165 ] |
| 8.1 | 2005年11月8日 | サポート対象外:8.1.23 | 2010年12月16日 | 2010年11月8日 | パフォーマンス最適化、2フェーズコミット、テーブルパーティション、インデックスビットマップスキャン、共有行ロック、ロール |
| 8.2 | 2006年12月5日 | サポート対象外:8.2.23 | 2011年12月5日 | 2011年12月5日 | パフォーマンス最適化、オンラインインデックス構築、アドバイザリロック、ウォームスタンバイ[ 166 ] |
| 8.3 | 2008年2月4日 | サポート対象外:8.3.23 | 2013年2月7日 | 2013年2月7日 | ヒープのみのタプル、全文検索、[ 167 ] SQL/XML、ENUM型、UUID型 |
| 8.4 | 2009年7月1日 | サポート対象外:8.4.22 | 2014年7月24日 | 2014年7月24日 | ウィンドウ関数、列レベルの権限、並列データベース復元、データベースごとの照合、共通テーブル式、再帰クエリ[ 168 ] |
| 9.0 | 2010年9月20日 | サポート対象外:9.0.23 | 2015年10月8日 | 2015年10月8日 | 組み込みバイナリストリーミングレプリケーション、ホットスタンバイ、インプレースアップグレード機能、64ビットWindows [ 169 ] |
| 9.1 | 2011年9月12日 | サポート対象外:9.1.24 | 2016年10月27日 | 2016年10月27日 | 同期レプリケーション、列ごとの照合順序、ログなしテーブル、シリアル化可能なスナップショット分離、書き込み可能な共通テーブル式、SELinux統合、拡張機能、外部テーブル[ 170 ] |
| 9.2 | 2012年9月10日[ 171 ] | サポート対象外:9.2.24 | 2017年11月9日 | 2017年11月9日 | カスケードストリーミングレプリケーション、インデックスのみのスキャン、ネイティブJSONサポート、改善されたロック管理、範囲型、pg_receivexlogツール、空間分割GiSTインデックス |
| 9.3 | 2013年9月9日 | サポート対象外:9.3.25 | 2018年11月8日 | 2018年11月8日 | カスタムバックグラウンドワーカー、データチェックサム、専用JSON演算子、LATERAL JOIN、高速化されたpg_dump、新しいpg_isreadyサーバー監視ツール、トリガー機能、ビュー機能、書き込み可能な外部テーブル、マテリアライズドビュー、レプリケーションの改善 |
| 9.4 | 2014年12月18日 | サポート対象外:9.4.26 | 2020年2月13日 | 2020年2月13日 | JSONBデータ型、設定値を変更するためのALTER SYSTEM文、読み取りをブロックせずにマテリアライズド・ビューを更新する機能、バックグラウンド・ワーカープロセスの動的な登録/開始/停止、論理デコードAPI、GiNインデックスの改善、Linuxヒュージページのサポート、pg_prewarmによるデータベースキャッシュの再読み込み、ドキュメント形式のデータに適した列型としてHstoreを再導入。[ 172 ] |
| 9.5 | 2016年1月7日 | サポート対象外:9.5.25 | 2021年2月11日 | 2021年2月11日 | UPSERT、行レベルセキュリティ、TABLESAMPLE、CUBE/ROLLUP、GROUPING SETS、新しいBRINインデックス[ 173 ] |
| 9.6 | 2016年9月29日 | サポート対象外:9.6.24 | 2021年11月11日 | 2021年11月11日 | 並列クエリのサポート、ソート/結合プッシュダウンによるPostgreSQL外部データラッパー(FDW)の改善、複数の同期スタンバイ、大規模テーブルの バキューム処理の高速化 |
| 10 | 2017年10月5日 | サポート対象外:10.23 | 2022年11月10日 | 2022年11月10日 | 論理レプリケーション、[ 174 ]宣言的テーブルパーティショニング、クエリ並列性の向上 |
| 11 | 2018年10月18日 | サポート対象外:11.22 | 2023年11月9日 | 2023年11月9日 | パーティショニングの堅牢性とパフォーマンスの向上、ストアドプロシージャでのトランザクションのサポート、クエリ並列処理の強化、式のジャストインタイム(JIT)コンパイル[ 175 ] [ 176 ] |
| 12 | 2019年10月3日 | サポート対象外:12.22 | 2024年11月21日 | 2024年11月21日 | クエリパフォーマンスとスペース使用率の向上、SQL/JSONパス式のサポート、生成列、国際化と認証の改善、新しいプラガブルテーブルストレージインターフェース。[ 177 ] |
| 13 | 2020年9月24日 | サポート対象外:13.23 | 2025年11月13日 | 2025年11月13日 | Bツリーインデックスエントリの重複排除によるスペース節約とパフォーマンス向上、集計またはパーティションテーブルを使用するクエリのパフォーマンス向上、拡張統計を使用した場合のクエリプランニングの改善、インデックスの並列バキューム、増分ソート[ 178 ] [ 179 ] |
| 14 | 2021年9月30日 | サポート対象:14.20 | 2025年11月13日 | 2026年11月12日 | 共通表式にSQL標準のSEARCH句とCYCLE句を追加し、GROUP BYにDISTINCTを追加できるようにしました[ 180 ] [ 181 ] |
| 15 | 2022年10月13日 | サポート対象:15.15 | 2025年11月13日 | 2027年11月11日 | SQL標準のMERGE文を実装します。PL/Pythonは現在、 Python 3のみをサポートしており、廃止されたPython 2ではなくPython 3を plpythonu意味します |
| 16 | 2023年9月14日 | サポート対象:16.11 | 2025年11月13日 | 2028年11月9日 | 論理レプリケーション、pg_stat_ioビュー(I/Oメトリクス用)の改善[ 182 ] |
| 17 | 2024年9月26日 | サポート対象:17.7 | 2025年11月13日 | 2029年11月8日 | バキュームプロセス、I/Oレイヤー、クエリ実行のパフォーマンス向上、JSON機能の拡張、MERGE機能の追加、COPYの改善。高可用性とアップグレードのための論理レプリケーションの強化、セキュリティ、運用、監視、分析の改善。[ 183 ] |
| 18 | 2025年9月25日 | 最新バージョン:18.1 | 2025年11月13日 | 2030年11月14日 | 新しいI/Oサブシステムと非同期I/Oの機能強化。[ 184 ] |

PostgreSQLは、その寛容なオープンソースライセンスと拡張可能なアーキテクチャにより、幅広いエコシステムを形成しています。これには、専用のサポートとホスティングを提供する多数の企業に加え、特定のワークロード向けにPostgreSQLを適応させたフォークや派生データベースが含まれます。注目すべき派生データベースには以下が含まれます。
:世界で最も先進的なオープンソースリレーショナルデータベース
は、地理空間データの保存、インデックス作成、クエリのサポートを追加することで、PostgreSQLリレーショナルデータベースの機能を拡張します。
は拡張してTemporal Databaseにすることができます。このようなデータベースは、データベースコンテンツの履歴を時間の経過とともに追跡し、自動的に保持し、変更やクエリを可能にします。
RDBMSの関数とパッケージのサブセットをエミュレートする関数と演算子。
DBMS_JOBパッケージと同様に、ジョブキュー内のジョブをスケジュールおよび管理するためのPostgreSQL拡張機能。
はWindows向けにパッケージ化されており、Microsoft SQL Serverの代替として使用できるように設計されています。
、Microsoft SQL Server用に作成されたアプリケーションからのクエリをPostgreSQLが理解する機能を提供します。
このページは、SQLを入力して結果を取得できる対話型SQLクライアント(GUIまたはその他の形式)の一部です。
エンティティ関係図などの作成を通じてスキーマ設計を支援するツール。ほとんどがGUIです。
このページは、Postgresで動作する様々なユーティリティ(例:データローダー、コンパレーターなど)のリストです。
PostgreSQLを単一サーバー上で実行する以外にも拡張する方法は数多くあります。…万能な方法はありません…
プロジェクトとコミュニティをサポートする目的での(PostgreSQLの名称の)使用を許可するよう、皆様と協力していきます。
このような規模の連続起業に携わった唯一のチューリング賞受賞者であり、学術界において独特の視点を持っている。
{{cite web}}:|last=一般的な名前があります(ヘルプ)外部データラッパー(FDW)は[...]外部データソースをクエリするためのメカニズムです。PostgreSQL 9.1で、このSQL/MED標準準拠の機能が導入されました
このドキュメントでは、PostgreSQL 7.4以降に実装されているプロトコルのバージョン3.0について説明します。
オープンソース版のPostgreSQLに加えて、VMwareはvFabric Postgres(vPostgres)を提供しています。vPostgresは、仮想環境向けに調整されたPostgreSQL仮想アプライアンスです
はPostgreSQLの拡張機能として実装されており、PostgreSQLインスタンス内で実行され、PostgreSQLと同じように操作できます。
は、フルマネージドのサーバーレスPostgreSQLです。ストレージとコンピューティングを分離し、PostgreSQLのストレージ層をクラウド向けに設計されたカスタムビルドのマルチテナントストレージエンジンに置き換えています。
for PostgreSQLは、PostgreSQLと互換性のあるフルマネージドデータベースサービスで、ハイブリッドトランザクション処理や分析処理など、最も要求の厳しいワークロード向けに設計されています。AlloyDBは分散型アーキテクチャを採用しています。コンピューティング層とストレージ層は分離されており、個別にスケーリングできます。