postgresql - Postgres 对一个非常简单的 SELECT x ... ORDER BY x 进行 Seq Scan 而不是 Index Only Scan

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

我在 Postgres 10 中有一个包含 1700 万行和 102 列的表 union_events。我运行命令:

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 上的索引没有被使用?

最佳答案

按照@joop 的建议,我为表创建了一个 VACUUM。

它导致了一个使用我的索引的更好的计划。

我仍然不清楚 VACUUM 如何帮助解决我使用 SELECT ... INTO TABLE 创建此表并且没有执行任何 UPDATE 或 DELETE 的事实。

如果有人能在其他答案中对此进行解释,那就太好了,也许存在一些比 VACUUM 更有效的解决方案。

关于postgresql - Postgres 对一个非常简单的 SELECT x ... ORDER BY x 进行 Seq Scan 而不是 Index Only Scan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53340270/

相关文章:

sql - 相互组合查询

ruby-on-rails - rails : Add UUID Primary Key to Table in Database Already Using UUIDs as Primary Keys

c - 如何在数组中存储 RGB 图像并在 C 中按 x,y 对其进行索引

MySQL 随意选择执行或不执行查询

sql-server - 检查变量是否为 NULL 会降低性能

sql - 从 PostgreSQL 上的 UNION ALL(不使用 UNION)中删除重复项的最快方法?

python - GeoDjango touches 功能很慢

javascript - 在 Javascript 中对值对进行排序

c++ - 如何检查数组索引是否存在

database - 防止 PostgreSQL 有时选择错误的查询计划