PostgreSQL-慢查询:“select * from table limit 1”

3

我正在使用PostgreSQL 9.3。我有一个包含超过6亿行数据的表的数据库。当我首次连接到该数据库时,第一个查询非常缓慢:

explain analyze select * from request_log limit 1;
Limit  (cost=0.00..0.02 rows=1 width=61) (actual time=481439.127..481439.129 rows=1 loops=1)
   ->  Seq Scan on request_log  (cost=0.00..13996870.79 rows=651159679 width=61) (actual time=481439.123..481439.123 rows=1 loops=1)
Total runtime: 481440.488 ms

我不明白为什么顺序扫描只读取第一行后不停止?


request_log 上有没有任何索引? - ninesided
是的,我有两个索引:一个是主键索引,另一个是单列索引。在这个顺序扫描过程中会有什么区别吗? - user3550394
我建议在查询中添加一个基于主键的 order by,以查看是否使用索引可以提高访问效率。 - ninesided
另外,request_log 上的统计数据是否可能已经过时? - ninesided
如果您第二次运行查询,时间是多少? - joop
显示剩余2条评论
1个回答

0

我认为你误读了explain analyse的输出。

这行代码 "Limit (cost=0.00..0.02 rows=1 width=61) (actual time=481439.127..481439.129 rows=1 loops=1)" 表明它已经限制了顺序扫描。

如果你不使用limit,

EXPLAIN ANALYSE SELECT * FROM request_log;

你可能会发现它需要更长的时间。

问题与数据库中的数据检索有关。检查 RESOURCE USUAGE 和 QUERY TUNING 下的 postgresql.conf 文件,查找任何异常情况。检查你的 postgresql 日志是否有异常情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接