Postgres-日期索引,用于读取之前或之后的日期(<,<=,>,> =)

时间:2019-11-13 05:48:57

标签: postgresql indexing

当我的状况在给定日期之前或之后,我的日期索引出现问题。 使用运算符(<,<=,>,> =)。

我的桌子看起来像这样

CREATE TABLE date_playground
(
  id          BIGSERIAL   NOT NULL,
  due_date    date        NOT NULL,

  primary key (id)
);

我的索引是

CREATE INDEX date_playground_idx_due_date
ON date_playground (due_date);

当我查询

-- SAMPLE  1 
EXPLAIN ANALYZE SELECT
  *
FROM  date_playground
WHERE due_date = '2019-09-07' :: DATE;

这使用索引

QUERY PLAN
Index Scan using date_playground_idx_due_date on date_playground  (cost=0.42..279.73 rows=75 width=287) (actual time=0.043..0.071 rows=10 loops=1)
  Index Cond: (due_date = '2019-09-07'::date)
Planning Time: 0.636 ms
Execution Time: 0.140 ms

但是,当我使用指定的运算符- <,<=,>,> =

-- SAMPLE 2
EXPLAIN ANALYZE SELECT
  *
FROM  ln.amortization_schedule_active a
WHERE due_date <= '2019-09-07' :: DATE;

QUERY PLAN
Seq Scan on date_playground  (cost=0.00..35133.86 rows=396944 width=287) (actual time=0.032..443.417 rows=404839 loops=1)
  Filter: (due_date <= '2019-09-07'::date)
  Rows Removed by Filter: 331870
Planning Time: 0.437 ms
Execution Time: 483.891 ms

它从不使用索引,它始终执行完整扫描。

谁能建议我如何优化第二个查询?

谢谢!

1 个答案:

答案 0 :(得分:1)

PostgreSQL 可以在第二个查询中使用索引,但是它正确地选择不执行该索引,因为这样效率低下。

对于选择表中一半行的查询,顺序扫描比索引扫描更有效:无论如何,索引扫描都必须访问大多数表块,因此为什么要打扰随机I / O或构建位图?