我有索引表:
Table:
Participates (player_id integer, other...)
Indexes:
"index_participates_on_player_id" btree (player_id)
表包含400kk行。 我执行两次相同的查询:
查询:explain analyze select * from participates where player_id=149294217;
第一次:
Index Scan using index_participates_on_player_id on participates (cost=0.57..19452.86 rows=6304 width=58) (actual time=261.061..2025.559 rows=332 loops=1)
Index Cond: (player_id = 149294217)
Total runtime: 2025.644 ms
(3 rows)
第二次:
Index Scan using index_participates_on_player_id on participates (cost=0.57..19452.86 rows=6304 width=58) (actual time=0.030..0.479 rows=332 loops=1)
Index Cond: (player_id = 149294217)
Total runtime: 0.527 ms
(3 rows)
所以,第一个查询有大actual time
- 如何在第一次执行时提高速度?
更新 对不起,如何加快第一次查询?)
为什么索引扫描搜索速度如此之慢?
答案 0 :(得分:1)
执行时间的差异可能是因为第二次通过,来自第一次运行查询的表/索引数据位于shared buffers
缓存中,因此后续运行的查询花费的时间更少,因为它不必为该信息转到磁盘的长路径。
修改强>
关于原始查询的缓慢程度,该表是否有很多dead tuples
?那些可以大大减慢速度。如果是,VACUUM ANALYZE
表格。
另一个因素可能是服务器上存在长期idle transactions
(即几分钟或更长时间)。由于MVCC
的性质,这甚至可以减慢甚至基于索引的查询。
此外,query planner
对结果与实际结果的预期差异很大,因此您可能需要事先对查询执行ANALYZE
以更新统计信息。
答案 1 :(得分:0)
1。)看看http://www.postgresql.org/docs/9.3/static/runtime-config-resource.html并查看是否需要更多内存进行调整。这可以加快您的搜索速度,但不会给您保修(取决于之前的答案)!
2。)将部分表/索引传输到更强大的表空间。例如,基于SSD的表空间。