当我的状况在给定日期之前或之后,我的日期索引出现问题。 使用运算符(<,<=,>,> =)。
我的桌子看起来像这样
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
它从不使用索引,它始终执行完整扫描。
谁能建议我如何优化第二个查询?
谢谢!
答案 0 :(得分:1)
PostgreSQL 可以在第二个查询中使用索引,但是它正确地选择不执行该索引,因为这样效率低下。
对于选择表中一半行的查询,顺序扫描比索引扫描更有效:无论如何,索引扫描都必须访问大多数表块,因此为什么要打扰随机I / O或构建位图?