我是SQL / RDBMS的新手。
我有一个应用程序,它使用libpq库在PostgreSQL服务器中添加10列的行。现在,我的服务器与我的visual c ++应用程序在同一台机器上运行。
我已经添加了大约15-20万条记录。获取总计数的简单查询使用select count(*) from <tableName>;
需要4-5分钟。
我已经为我输入数据(时间码)的时间索引了我的表格。大多数情况下,我需要添加不同的WHERE
/ AND
条款。
有什么方法可以让事情变得快速吗?我需要尽可能快地完成它,因为一旦服务器转移到网络,事情就会变慢。
由于
答案 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>;
查询,甚至可能会降低速度,但如果您通常只对表格中的部分数据感兴趣,这可能会有所帮助。