0

我是 SQL/RDBMS 的新手。

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

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

我已经用输入数据的时间(时间码)索引了我的表。大多数时候,我需要添加不同的WHERE/AND子句。

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

谢谢

4

3 回答 3

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 设置运行的频率和许多其他因素;见评论。

于 2012-07-28T12:08:37.340 回答
1

考虑pg_relation_size('tablename')并除以花费的秒数

select count(*) from tablename

这将在对该表进行完整扫描时提供磁盘的吞吐量。如果它太低,您首先要专注于改进它。拥有良好的 I/O 子系统和性能良好的操作系统磁盘缓存对于数据库至关重要。

默认的 postgres 配置是为了不消耗太多资源来与其他应用程序一起玩。根据您的硬件和机器的整体利用率,您可能需要向上调整几个性能参数,例如shared_buffersEffective_cache_sizework_mem。请参阅特定版本的文档和 wiki 的性能优化页面。

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

于 2012-07-28T15:43:59.643 回答
0

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

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

于 2012-07-29T01:28:33.577 回答