【问题标题】:SELECT performance issues on postgresql 9.1postgresql 9.1 上的 SELECT 性能问题
【发布时间】:2012-11-26 08:08:44
【问题描述】:

我正在 ubuntu 12.04 上构建一个大型 postgres 9.1 数据库,其中一个表包含大约 8000 万行左右。每当我运行 SELECT 语句时:

SELECT * FROM db WHERE ID=1;

执行只返回几千行的查询大约需要 2.5 分钟。在磁盘 I/O 上运行一些诊断程序后,我认为这不是问题,但以防万一下面是诊断程序的输出。 (我有 2GB 的 RAM)我不确定这里有什么好的输出,但考虑到互联网上其他服务器的统计数据,这似乎是一个大概。

time sh -c "dd if=/dev/zero of=bigfile bs=8k count=500000 && sync"


500000+0 records in
500000+0 records out
4096000000 bytes (4.1 GB) copied, 106.969 s, 38.3 MB/s

real    1m49.091s
user    0m0.248s
sys     0m9.369s

我对 postgresql.conf 进行了相当大的修改,将有效缓存提高到 75% 的内存,shared_buffers 提高到 25%,checkpoint_segments 提高到 15,work_mem 提高到 256MB,autovacuum,内核上的 SHMMAX 等等。我的性能有了一些提升,但是不超过 5% 更好。网络不应该是一个问题,因为即使在 localhost 上运行它仍然需要很长时间。我打算添加更多数据,查询时间似乎随着行数的增加而快速增长。

似乎我应该能够在几秒钟内运行这些 SELECT 语句,而不是几分钟。关于这个瓶颈可能在哪里的任何建议?

【问题讨论】:

标签: postgresql io ubuntu-12.04 postgresql-9.1


【解决方案1】:

很抱歉,这显然是不可原谅的,但是您在 ID 列上有索引吗?

另外,虽然我不是在责怪磁盘,但您只是测试了顺序带宽,它很少告诉您有关延迟的信息。虽然我不得不说,即使是这样的衡量标准,38 MB/s 也令人印象深刻......

【讨论】:

  • 我没有索引,谢谢你的建议。我戴上一个,现在查询时间减少到大约 70 秒。仍然比我想要的要长得多。考虑天气问题出在磁盘 I/O 上吗?
  • 您在创建索引后是否运行VACUUM ANALYZE?实际上有多少行 id =1 ?有多少没有?
  • 大约 8000 行的 id=1(它有一个带时间戳的复合键),其余的则没有(99.99%)。我只在 ID 列而不是复合键上创建了第二个索引(这是不好的风格吗?)。现在查询在 4 秒内执行。谢谢!!!
  • @froot93:你的复合键是按什么顺序排列的?如果 id 是第一个,则不需要第二个索引(保持索引会在插入时花费时间)。 4秒听起来仍然很慢。也许你做了 a_horse_with_no_name 在他的评论中要求的。
猜你喜欢
  • 1970-01-01
  • 2016-09-29
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多