慢速索引扫描

时间:2014-05-26 04:02:12

标签: postgresql indexing

我有索引表:

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 - 如何在第一次执行时提高速度?

更新 对不起,如何加快第一次查询?)

为什么索引扫描搜索速度如此之慢?

2 个答案:

答案 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的表空间。