約 1mil のレコードを取得するビューがあります。一時テーブルが作成されるまでに約 15 分かかります。それにもかかわらず、私の CPU コアの 1 つだけが負荷を示しており、他の 7 つのコアは利用可能です。このプロセスにすべてのコアを使用するにはどうすればよいですか?
create table feed_03_tmp as SELECT * FROM feed_03;
約 1mil のレコードを取得するビューがあります。一時テーブルが作成されるまでに約 15 分かかります。それにもかかわらず、私の CPU コアの 1 つだけが負荷を示しており、他の 7 つのコアは利用可能です。このプロセスにすべてのコアを使用するにはどうすればよいですか?
create table feed_03_tmp as SELECT * FROM feed_03;
PostgreSQLバックエンドはシングルスレッドであり、クライアントごとに1つのバックエンドがあるため、単一のクライアントは単一のコアのみを使用できます。ただし、このような単純なクエリの場合、IOバウンドであると確信しています。IOバウンドの場合、常に100%のCPUバウンドであれば、作業を行う1つのコアの負荷は100%未満になります。
複数の接続を開き、それぞれに選択した行をコピーさせることで、複数のコアを使用できますが、前述したように、おそらく役に立たないでしょう。各接続は独自のトランザクションで行われることに注意してください。
IOを改善するには、一時テーブルを別のドライブに保存することでメリットが得られる場合があります。これを行うには、2番目のドライブに表領域を作成し、createtableステートメントにTABLESPACE句を追加します。
CREATE TABLE feed_03_tmp
TABLESPACE my_temp_tablespace
AS SELECT * FROM feed_03;
ところで:postgresql開発者はマルチスレッドの導入を実験していますが、広く使用されてリリースされるまでにはおそらく時間がかかるでしょう。