【发布时间】:2013-04-09 00:16:58
【问题描述】:
我需要帮助来优化 PostgreSQL 查询,该查询使用带有 timestamp 字段的 BETWEEN 子句。
我有两张桌子:
ONE(int id_one(PK), datetime cut_time, int f1 . . .)
包含大约 3394 行
TWO(int id_two(PK), int id_one(FK), int f2 . . .)
包含大约 4000000 行
在 PK id_one 和 id_two 上,在 FK id_one 和 cut_time 上都有 btree 索引。
我想执行如下查询:
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 行。
在解释分析报告下方报告:
"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"
未使用时间戳列上的索引。如何优化这个查询?
【问题讨论】:
-
您是否禁用了规划器选项? cost=10000000000.00 的成本看起来非常可疑。
-
如何设置规划器选项的默认值?
-
我在想您可能会将其中一项或多项更改为关闭:postgresql.org/docs/9.2/static/…
标签: sql postgresql indexing between postgresql-performance