【问题标题】:Postgres: CPU bound CREATE INDEXPostgres:CPU 绑定 CREATE INDEX
【发布时间】:2017-02-27 22:56:26
【问题描述】:

我在一台速度较慢的旧计算机上运行 postgres 服务器,该计算机具有快速 SSD 磁盘、2.4 GHz i5 处理器和 8 GB 内存。计算机不是速度怪物,但我对性能感到惊讶。在具有 40,000,000 行的表中创建索引大约需要半小时。我的设置如下:

max_connections = 2
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 1GB
maintenance_work_mem = 512MB
min_wal_size = 1GB
max_wal_size = 2GB
checkpoint_completion_target = 0.7
wal_buffers = 16MB
default_statistics_target = 100

当我查看top 的输出时,看起来我受 CPU 限制(100% CPU),尽管数据库使用的内存约为 500 MB,我希望它会使用更多。

我将在第一次数据导入期间为每个表创建一次索引。我可以调整任何设置来加快此操作吗?

【问题讨论】:

  • 如果您受 CPU 限制...没有什么可以调整的了。
  • 是一个计算量大的索引吗?这样就可以解释了。也许您可以显示CREATE INDEX 声明。增加maintenance_work_mem会不会变快?
  • 我会与maintenance_work_mem 核实。创建很简单,CREATE INDEX index_name on name (varcharField);
  • @LaurenzAlbe 我应该增加多少maintenance_work_mem?时间也“无论如何正常”?第一次遇到进步,所以我很难说。
  • 您可以尝试使用 1GB maintenance_work_mem 看看是否会更快。它看起来真的很慢——在我们的系统上,我们的速度大约是这个速度的十倍。要查看时间花在哪里,如果您使用的是 Linux(需要调试符号),您可以使用 perfOProfile 进行分析。

标签: sql performance postgresql


【解决方案1】:

在将 maintenance_work_mem 增加到 1GB 并使用 C 区域设置(而不是我系统上的一个默认设置)初始化数据库集群后,只用了 2 分钟。

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 2012-11-28
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2013-06-11
    • 2013-07-18
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多