0

我正在 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 语句,而不是几分钟。关于这个瓶颈可能在哪里的任何建议?

4

1 回答 1

1

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

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

于 2012-11-25T18:00:24.930 回答