3

我的观点可以收集大约 100 万条记录;创建临时表大约需要 15 分钟。尽管如此,我的 CPU 内核中只有 1 个显示负载,其他 7 个内核可用。我怎样才能在这个过程中使用所有核心?

create table feed_03_tmp as SELECT *  FROM feed_03;
4

1 回答 1

1

PostgreSQL 后端是单线程的,每个客户端有一个后端,因此单个客户端只能使用单个内核。但是对于这样一个简单的查询,我很确定你是 IO 绑定的。如果您受 IO 限制,则执行工作的一个核心将低于 100% 负载,如果它始终处于 100%,则您受 CPU 限制。

您可以通过打开多个连接来使用一个以上的核心,并让每个连接复制一组行,但正如我所说,它可能无济于事。请注意,每个连接都将在它自己的事务中。

为了提高 IO,您可能会受益于将临时表存储在单独的驱动器上。为此,请在第二个驱动器上创建一个表空间,并将 TABLESPACE 子句添加到您的 create table 语句中。

CREATE TABLE feed_03_tmp 
  TABLESPACE my_temp_tablespace
  AS SELECT *  FROM feed_03;

顺便说一句:postgresql 开发人员正在尝试引入多线程,但它可能需要一段时间才能被广泛使用并发布。

于 2012-07-25T05:58:06.360 回答