web-dev-qa-db-ja.com

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

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

60
ALH

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

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

バージョン9.6以降、一部のクエリのportionsを別々のOSプロセスで並行して実行できるため、複数のCPUコアを使用できます。 パラレルクエリは、バージョン10(max_parallel_workers_per_gather)でデフォルトで有効になっており、将来のリリースで追加の並列処理が期待されます。

52
Jayadevan

PostgreSQL9.6 +以降、Parallel-QueryがようやくPostgreSQLに登場するようになります。

たとえば Parallel Scan / Parallel Join / Parallel Aggregates のような概念はすでに組み込まれており、さらに多くのものが近々登場します。

本当にエキサイティングなのは reports 確認near-linear speed-upいくつかのケースでは、それはかなり印象的です!

38
Robins Tharakan

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

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

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

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

8
Evgen Bodunov

いいえ。接続ごとにサーバー上に個別のプロセスが生成されます。

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

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

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

3
cavila