Postgres 使用 seq 扫描而不是仅索引扫描

时间:2021-07-25 16:39:03

标签: postgresql indexing

我在表 ref_class 上创建了一个索引:

CREATE INDEX ref_class_recl_iid_rcl_ivaleur_idx
    ON ref_class (rcl_iid,rcl_ivaleur);

当我执行选择以检索 rcl_iid 和 rcl_ivaleur 时,我希望优化器将使用上面的索引进行仅索引扫描。但是,它使用顺序扫描。 选择查询如下:

select rcl_ivaleur from ref_class where rcl_iid = 1;

Postgres 使用的执行计划如下:

Seq Scan on ref_class  (cost=0.00..7.47 rows=1 width=4) (actual time=0.036..0.036 rows=0 loops=1)
Planning Time: 0.093 ms
Execution Time: 0.048 ms
  Rows Removed by Filter: 278
  Output: rcl_ivaleur
  Filter: (ref_class.rcl_iid = 1)
  Buffers: shared hit=4

我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

在优化器下面运行查询后选择了仅索引扫描:

VACUUM ANALYZE ref_class;

答案 1 :(得分:0)

它是一个复合索引,因此您需要按照您在 create index 语句中创建的字段 (rcl_iid,rcl_ivaleur) 的相同顺序使用 where 子句中的两个字段。只有它才会使用索引扫描。

相关问题