2012-07-25 41 views
3

我有一个观点,拉1mil左右的记录;大约需要15分钟才能创建临时表。不过,我的CPU内核中只有1个显示负载,其他7个内核可用。我如何在这个过程中使用所有内核?基于视图创建表 - 最快的方法,使用多线程

create table feed_03_tmp as SELECT * FROM feed_03; 
+0

你是CPU绑定还是IO绑定?你是否为你的工作负载优化了配置参数? – 2012-07-25 04:40:14

+0

根据视图和查询计划的不同,您可以尝试为_that_客户端提供更多内存来处理:'将work_mem设置为'1GB'。 – 2012-07-25 10:32:38

+0

设置work_mem非常高,有时会有所帮助,但通常不是一个好建议。这一切都取决于视图定义:如果可以进行合并连接,那么这应该是首选(恕我直言),特别是对于大型结果集。 – wildplasser 2012-07-25 14:10:13

回答

1

PostgreSQL的后端是单线程并且存在每个客户端一个后端因此单个客户端只能使用单个芯。然而,对于这样一个简单的查询,我很肯定你是IO绑定的。如果你是IO界限的,那么执行这个工作的一个核心将会低于100%的负载,如果它始终处于100%CPU占用。

您可以通过打开多个连接来使用多个核心,并让每个核心都复制一行选择,但正如我所说的那样,这可能不会有帮助。请注意,每个连接都将在它自己的事务中。

要提高IO性能,您可以将临时表存储在单独的驱动器上,从而获益。为此,请在第二个驱动器上创建一个表空间,并在创建表语句中添加一个TABLESPACE子句。

CREATE TABLE feed_03_tmp 
    TABLESPACE my_temp_tablespace 
    AS SELECT * FROM feed_03; 

BTW:PostgreSQL的开发与引入多线程尝试,但它得到广泛应用,并使其成为一个版本,它可能会需要一段时间。

相关问题