2012-11-25 66 views
0

我在Ubuntu 12.04上构建了一个大型的postgres 9.1数据库,其中一个表格可以容纳大约8000万行左右的数据。每当我运行一条SELECT语句时:关于postgresql的SELECT性能问题9.1

SELECT * FROM db WHERE ID=1; 

执行只返回几千行的查询需要将近2.5分钟。在磁盘I/O上运行一些诊断之后,我认为这不是问题,但以下是诊断的输出。 (我有2GB的内存)我不确定这里有多好的输出,但是它给出了在互联网上其他服务器的统计数据。

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,助推effective_cache到RAM中的75%,的shared_buffers至25%,CHECKPOINT_SEGMENTS至15 work_mem为256MB,自动清理,SHMMAX的内核,等我有一些性能提高,但不超过5%。网络不应该成为一个问题,因为即使在本地主机上运行它也需要很长时间。我计划添加更多数据,并且查询时间似乎随着行数迅速增长。

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

+2

向我们展示查询的执行计划并包含表定义('create table' ...)。另请参阅:http://wiki.postgresql.org/wiki/Slow_Query_Questions –

+0

你对自动清理做了什么? – kgrittn

回答

1

对不起,如果这不明显,但你有一个索引ID列?

另外,虽然我不是在责怪磁盘,但你只是测试了连续带宽,这个连接带来的延迟很少。尽管我不得不说,即使对于这种措施,38 MB /秒也是不足的...

+0

我没有索引,谢谢你的建议。我把一个,现在的查询下降到70秒左右。尽管如此,仍然比我想要的要长很多。关于天气问题的想法是磁盘I/O? – froot93

+0

您是否在创建索引后运行'VACUUM ANALYZE'?实际上有多少行id = 1?多少不? – wildplasser

+0

大约8000行的id = 1(它有一个带有时间戳的复合键),其余的不是(99.99%)。我在ID列创建了第二个索引(是那种不好的样式?),而不是复合键。现在查询在4秒内执行。谢谢!!! – froot93