Postges使Seq Scan而不是Index Only Scan成为一个非常简单的SELECT x ... ORDER BY x

时间:2018-11-16 14:57:36

标签: postgresql indexing sql-execution-plan database-indexes

在Postgres 10中,我有一个表union_events,其中有1700万行和102列。我运行以下命令:

CREATE INDEX union_events_index ON temp_schema_to_delete.union_events(id)
ANALYZE temp_schema_to_delete.union_events
EXPLAIN SELECT id FROM temp_schema_to_delete.union_events ORDER BY id

并获得以下结果:

Sort  (cost=3614290.72..3658708.19 rows=17766988 width=4)
    Sort Key: id
    ->  Seq Scan on union_events  (cost=0.00..1474905.88 rows=17766988 width=4)

id是一些非空且非唯一的整数字段。

我希望索引会被使用,并且我不再对表进行排序。

我做了一个快速测试:

SELECT s INTO temp_schema_to_delete.test FROM generate_series(0, 10000000) AS s
CREATE INDEX test_index ON temp_schema_to_delete.test(s)
ANALYZE temp_schema_to_delete.test
EXPLAIN SELECT s FROM temp_schema_to_delete.test ORDER BY s

它得到:

Index Only Scan using test_index on test  (cost=0.43..303940.15 rows=10000048 width=4)

看来还可以。

我的第一个表或查询出了什么问题?为什么不使用id上的索引?

1 个答案:

答案 0 :(得分:0)

按照@joop的建议,我为桌子做了VACUUM。

使用我的索引得出了更好的计划。

对于我来说,仍然不清楚,VACUUM如何帮助我使用SELECT ... INTO TABLE创建此表并且没有执行任何UPDATE或DELETE操作。

如果有人可以在其他答案中对此进行解释,那就太好了,也许还有一些有效的解决方案,然后是VACUUM。