我是SQL/RDBMS新手。
我有一个应用程序,它使用libpq库在PostgreSQL服务器中添加了10列的行。现在,我的服务器和我的visual c++应用程序运行在同一台机器上。
我增加了1500万到2000万张唱片。获取总计数的简单查询是使用select count(*) from <tableName>;
花费4-5分钟。
我已经在输入数据时索引了表(时间码)。大多数时候,我需要用不同的WHERE
/AND
子句来计数。
有什么方法可以让事情变快吗?我需要使它尽可能快,因为一旦服务器移动到网络,事情会变得慢得多。
谢谢
最佳答案
我不认为网络延迟是影响查询时间的主要因素。所有的处理都在PostgreSQL服务器上完成。
PostgreSQL MVCC的设计意味着表中的每一行——不仅仅是索引——必须遍历以计算计数(*),这是一个代价高昂的操作。在你的案例中,涉及到很多行。
这里有一个很好的关于这个主题的wiki页面http://wiki.postgresql.org/wiki/Slow_Counting和建议。
来自此链接的两个建议,一个是使用索引列:
select count(index-col) from ...;
... 尽管这只在某些情况下有效。
如果有多个索引,请使用以下方法查看哪个索引的成本最低:
EXPLAIN ANALYZE select count(index-col) from ...;
如果您可以使用近似值,则另一种方法是使用PASGRES-特定函数来近似值,例如:
select reltuples from pg_class where relname='mytable';
这个近似值有多好取决于自动真空的运行和许多其他因素;请参阅评论。
关于sql - libpq对于大型(2000万记录)数据库非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11700801/