postgresql slow:80M行表上的主键

时间:2016-08-08 12:32:32

标签: postgresql

我有64GB RAM机器,20个CPU,这是在80M行的表上创建主键的命令:

ALTER TABLE ONLY wikipedia_article ADD CONSTRAINT pagelinks_pkey PRIMARY KEY (language, title);

我遇到的问题是:

  • 只有1个CPU使用率高达100%(平均负载率为99%),其余部分未使用
  • 主键创建期间的写入速度非常低,2.6 M / s,读取速度完全从pg_activity生成的报告中丢失

这是表结构:

                          Table "public.wikipedia_article"
    Column    |       Type       | Modifiers | Storage  | Stats target | Description
--------------+------------------+-----------+----------+--------------+-------------
 language     | text             | not null  | extended |              |
 title        | text             | not null  | extended |              |
 langcount    | integer          |           | plain    |              |
 othercount   | integer          |           | plain    |              |
 totalcount   | integer          |           | plain    |              |
 lat          | double precision |           | plain    |              |
 lon          | double precision |           | plain    |              |
 importance   | double precision |           | plain    |              |
 osm_type     | character(1)     |           | extended |              |
 osm_id       | bigint           |           | plain    |              |
 infobox_type | text             |           | extended |              |
 population   | bigint           |           | plain    |              |
 website      | text             |           | extended |              |
Has OIDs: no

导入通过pg_restore自动发生,这是源

http://www.nominatim.org/data/wikipedia_article.sql.bin

关于我可以尝试使事情变得更快的任何想法?我改变了conf varible" maintenance_work_mem"的值。到RAM大小的一半。我也尝试改变一些内核设置,没有任何乐趣:

sysctl -w kernel.shmmax=17179869184
sysctl -w kernel.shmall=1048576
sysctl vm.overcommit_memory=1 
sysctl vm.swappiness=10

操作系统在虚拟机上运行,​​在数字海洋中,在SSD驱动器上运行,我原本期望这对于这样的虚拟机配置可以更快地运行。

服务器信息:x86_64-unknown-linux-gnu上的PostgreSQL 9.3.13,由gcc编译(Ubuntu 4.8.4-2ubuntu1~14.04.1)4.8.4,64位

非常感谢,VG

1 个答案:

答案 0 :(得分:0)

PostgreSQL使用一个语句一个CPU - 因此预计CPU利用率为100%。您可以尝试将maintenance_work_mem设置为更高的值。默认值太低 - 例如,您可以尝试'2GB'。