PostgreSQL表没有在日期列上使用索引

时间:2017-05-04 02:10:19

标签: postgresql

我有一个看起来像这样的表:

CREATE TABLE a (a_id int), (my_date date)
CREATE INDEX idx_my_date ON a USING BTREE (my_date)

该表有大约140M行,我试图通过BETWEEN日期查询查询该表...并且由于某种原因它没有使用my_date上的索引。

我正在尝试运行查询:

SELECT COUNT(*) from "a" 
where "a"."my_date" >= to_date('2017-04-28', 'YYYY-MM-DD') 
and "a"."my_date" <= to_date('2017-05-03', 'YYYY-MM-DD');

Aggregate  (cost=4666237.99..4666238.00 rows=1 width=8)
  Seq Scan on a  (cost=0.00..4314558.32 rows=140671866 width=0)
        Filter: ((my_date >= to_date('2017-04-28'::text, 'YYYY-MM-DD'::text)) AND (my_date <= to_date('2017-05-03'::text, 'YYYY-MM-DD'::text)))

我有什么办法可以强迫这个查询使用我的索引吗?

1 个答案:

答案 0 :(得分:0)

如果禁用seqscan,则PostrgeSQL必须使用索引。您可以使用查询执行此操作:

SET ENABLE_SEQSCAN = FALSE;

请记住,它仅影响内部事务,因此如果您已启用AUTOCOMMIT,则必须禁用它或将所有内容包装在事务中,如下所示:

BEGIN;
    SET ENABLE_SEQSCAN = FALSE;
    EXPLAIN ANALYZE
    -- your query here
COMMIT;

但是,即使这样可行,强制查询计划程序选择其他计划也不是最佳解决方案,因此您应该考虑来自here的建议。