web-dev-qa-db-ja.com

CTEはマルチスレッド化されていますか?

ここここ はそうだと示唆しているようですが、複数行の単一ステートメントの挿入では1つのスレッドしか使用しないと言われています(ソースは特定できません)。すべての書き込み、つまりマルチスレッド化するには、クエリを分割して、コアと同じ数の接続に送信する必要があります。

documentation は、CTEが「同時に」実行されることを示していますが、「CTEは使用可能なすべてのコアを使用して並列サブステートメントやメインクエリを処理する」と明示的に述べているものはありません。

CTEは、並列タスクに使用可能なすべてのコアを常に使用しますか?もしそうなら、RETURNINGとの連鎖から合理的に想定できること以外に注意点はありますか?

3
Jim Bob

Postgresは現在、単一のクエリを実行するときに並列処理を使用しません。実行エンジン全体は、クエリごとにシングルスレッドです(もちろん、複数のクエリを並行して実行することもできます)。この「クエリ内並列処理」の欠如は、PostgresまたはMySQLを実行することの大きな欠点の1つです。基本的に、これらのエンジンは大規模なデータセットでの目的には適していません。

マルチスレッドのPostgresを実行するには、クエリを自分で複数のクエリに分割するか、Amazon RedshiftやGreenplumなどのPostgres互換バリアントを実行する必要があります(前者はコードベースにクエリ内並列処理を追加し、後者は君は)。

並列クエリを実行する必要があると感じたときは、まず自分自身に問いかけてください。並列処理なしでこれを十分に高速化するインデックスを追加できますか?その答えが「はい」の場合は、最初にそのオプションを追求してください。ただし、非常に多くの場合、ブルートフォースが必要です。そして、ブルートフォースに関して言えば、VanillaPostgresは残念ながら特に優れたデータベースエンジンではありません。

5
Thomas Kejser