我可以帮您优化一个使用BETWEEN
和timestamp
字段的Postgres查询。
我有两张表:
ONE(int id_one(PK), datetime cut_time, int f1 ...)
包含约3394行的内容
TWO(int id_two(PK), int id_one(FK), int f2 ...)
包含约4000000行数据。
id_one
和id_two
的主键,id_one
和cut_time
的外键都有B树索引。
我想执行以下查询:
select o.id_one, Date(o.cut_time), o.f1, t.f2
from one o
inner join two t ON (o.id_one = t.id_one)
where o.cut_time between '2013-01-01' and '2013-01-31';
这个查询在大约7秒钟内检索了约1,700,000行。
下面报告了explain analyze报告:
Merge Join (cost=20000000003.53..20000197562.38 rows=1680916 width=24) (actual time=0.017..741.718 rows=1692345 loops=1)"
Merge Cond: (c.coilid = hf.coilid)
-> Index Scan using pk_coils on coils c (cost=10000000000.00..10000000382.13 rows=1420 width=16) (actual time=0.008..4.539 rows=1404 loops=1)
Filter: ((cut_time >= '2013-01-01 00:00:00'::timestamp without time zone) AND (cut_time <= '2013-01-31 00:00:00'::timestamp without time zone))
Rows Removed by Filter: 1990
-> Index Scan using idx_fk_lf_data on hf_data hf (cost=10000000000.00..10000166145.90 rows=4017625 width=16) (actual time=0.003..392.535 rows=1963386 loops=1)
Total runtime: 768.473 ms
时间戳列上的索引未被使用。如何优化此查询?