1つのPostgreSQLクエリで複数のコアを使用できますか?


57

PostgreSQLの最新バージョン(2013年12月現在)では、パフォーマンスを向上させるために2つ以上のコア間でクエリを共有できますか?または、より高速なコアを取得する必要がありますか?

回答:


49

いいえ、v9.6より前のバージョンのPostgreSQLの場合。PostgreSQL FAQ:PostgreSQLはどのようにCPUリソースを使用しますか?をご覧ください。

PostgreSQLサーバーはプロセスベースです(スレッド化されていません)。各データベースセッションは、単一の PostgreSQLオペレーティングシステム(OS)プロセスに接続します。複数のセッションは、OSによって使用可能なすべてのCPUに自動的に分散されます。また、OSはCPUを使用してディスクI / Oを処理し、他の非データベースタスクを実行します。クライアントアプリケーションはスレッドを使用でき、各スレッドは個別のデータベースプロセスに接続します。

バージョン9.6以来、一部いくつかのクエリは、複数のCPUコアの使用を可能にする、別個のOSプロセスで並列に実行することができます。バージョン10(max_parallel_workers_per_gather)ではデフォルトで並列クエリが有効になっていますが、将来のリリースでは並列処理が追加される予定です。



8

いいえ、しかし回避策があります。:)

主キーに基づいてクエリを分割し、dblink拡張機能を介してデータベースに接続し、すべてのサブクエリを待機するparsel(並列選択)plpgsql関数を見つけました。

https://gist.github.com/mjgleaso/8031067

著者は、この関数に関する記事も書いています:http : //geeohspatial.blogspot.com/2013/12/a-simple-function-for-parallel-queries_18.html


3

いいえ。各接続はサーバー上で個別のプロセスを生成します。

pljavaのようなスレッド化された手続き言語を使用して、並列性を「エミュレート」できます。複数のスレッドを起動するjavaプロシージャ(関数)を作成し、複数のワーカーを使用して出力結果を作成します。バックエンドは同期されているため、各ワーカーは出力を非同期に更新できます。

Javaは、スレッドの調整/協力を適切にサポートしています。

例として、これはCPUを集中的に使用する操作やネットワーク長の操作に適しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.