libpq对于大型(2000万条记录)数据库来说非常慢

时间:2012-07-28 11:55:55

标签: sql postgresql visual-c++

我是SQL / RDBMS的新手。

我有一个应用程序,它使用libpq库在PostgreSQL服务器中添加10列的行。现在,我的服务器与我的visual c ++应用程序在同一台机器上运行。

我已经添加了大约15-20万条记录。获取总计数的简单查询使用select count(*) from <tableName>;需要4-5分钟。

我已经为我输入数据(时间码)的时间索引了我的表格。大多数情况下,我需要添加不同的WHERE / AND条款。

有什么方法可以让事情变得快速吗?我需要尽可能快地完成它,因为一旦服务器转移到网络,事情就会变慢。

由于

3 个答案:

答案 0 :(得分:2)

我认为网络延迟不会成为查询花费时间的重要因素。所有处理都在PostgreSQL服务器上完成。

PostgreSQL MVCC设计意味着表中的每一行 - 不仅仅是索引 - 必须走路来计算计数(*),这是一项昂贵的操作。在你的情况下,涉及很多行。

这里有一个关于此主题的好的wiki页面http://wiki.postgresql.org/wiki/Slow_Counting并附有建议。

此链接有两个建议,一个是使用索引列:

select count(index-col) from ...;

......虽然这只适用于某些情况。

如果您有多个索引,请使用以下方法查看哪个索引成本最低:

EXPLAIN ANALYZE select count(index-col) from ...;

如果您可以使用近似值,则另一种方法是使用Postgres特定函数来获得近似值:

select reltuples from pg_class where relname='mytable';

这种近似值有多好取决于autovacuum设置运行的频率和许多其他因素;看到评论。

答案 1 :(得分:1)

考虑pg_relation_size('tablename')并将其除以

中花费的秒数
select count(*) from tablename

这将在完成此表的完整扫描时提供磁盘的吞吐量。如果它太低,你首先要集中精力改进它。 拥有良好的I / O子系统和良好的操作系统磁盘缓存对数据库至关重要。

默认的postgres配置意味着不会消耗太多资源来与其他应用程序一起玩。根据您的硬件和机器的整体利用率,您可能需要调整多个性能参数,例如 shared_buffers effective_cache_size work_mem 。请参阅特定版本的文档和wiki的performance optimization页面。

另请注意,select count(*)样式查询的速度与libpq或网络无关,因为只检索到一行结果行。它完全发生在服务器端。

答案 2 :(得分:0)

您没有说明您的数据是什么,但通常处理具有大量数据的表的原因是对表进行分区。 http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

这不会加速select count(*) from <tableName>;查询,甚至可能会降低速度,但如果您通常只对表格中的部分数据感兴趣,这可能会有所帮助。