PostgreSQLの最近のバージョン(2013年12月現在)では、パフォーマンスを向上させるために2つ以上のコア間でクエリを共有できますか?または、より高速なコアを取得する必要がありますか?
いいえ、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)でデフォルトで有効になっており、将来のリリースで追加の並列処理が期待されます。
PostgreSQL9.6 +以降、Parallel-QueryがようやくPostgreSQLに登場するようになります。
たとえば Parallel Scan / Parallel Join / Parallel Aggregates のような概念はすでに組み込まれており、さらに多くのものが近々登場します。
本当にエキサイティングなのは reports 確認near-linear speed-up
いくつかのケースでは、それはかなり印象的です!
いいえ、ただし回避策があります。 :)
主キーに基づいてクエリを分割し、dblink拡張機能を介してデータベースに接続してすべてのサブクエリを待機するparsel(並列選択)plpgsql関数を見つけました。
https://Gist.github.com/mjgleaso/8031067
著者はこの関数に関する記事も書いています: http://geeohspatial.blogspot.com/2013/12/a-simple-function-for-parallel-queries_18.html
いいえ。接続ごとにサーバー上に個別のプロセスが生成されます。
Pljavaのようなスレッド化された手続き型言語を使用して、並列処理を「エミュレート」できます。複数のスレッドを起動し、複数のワーカーを使用して出力結果を作成するJavaプロシージャ(関数)を作成します。バックエンドは同期されているため、各ワーカーは非同期で出力を更新できます。
Javaはスレッドの調整/協調を適切にサポートしています。
例として、これはCPUを集中的に使用する操作やネットワーク長の操作に適しています。