我有一个看起来像这样的表:
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)))
我有什么办法可以强迫这个查询使用我的索引吗?
答案 0 :(得分:0)
如果禁用seqscan,则PostrgeSQL必须使用索引。您可以使用查询执行此操作:
SET ENABLE_SEQSCAN = FALSE;
请记住,它仅影响内部事务,因此如果您已启用AUTOCOMMIT,则必须禁用它或将所有内容包装在事务中,如下所示:
BEGIN;
SET ENABLE_SEQSCAN = FALSE;
EXPLAIN ANALYZE
-- your query here
COMMIT;
但是,即使这样可行,强制查询计划程序选择其他计划也不是最佳解决方案,因此您应该考虑来自here的建议。