【发布时间】:2012-07-30 08:04:11
【问题描述】:
当我使用以下查询时,响应时间真的很糟糕(有时超过一分钟!)。
select * from cdr where start_time < now() - interval '4 hours' and final = 0 limit 50
我正在尝试获取 final=0 且 starttime 超过 4 小时的记录。 以下是我在桌子上的索引:
CREATE INDEX "cdr_Final_ix"
ON cdr
USING btree
(start_time , final );
以下是解释分析:
"Limit (cost=0.00..167.81 rows=50 width=188) (actual time=64491.409..64650.635 rows=11 loops=1)"
" -> Seq Scan on cdr (cost=0.00..749671.06 rows=223372 width=188) (actual time=64491.407..64650.625 rows=11 loops=1)"
"Filter: ((final = 0) AND (start_time < (now() - '04:00:00'::interval)))"
"Total runtime: 64650.690 ms"
任何帮助将不胜感激。谢谢,阿里
【问题讨论】:
-
多少行?有多少符合条件?注意:你没有
order by -
顺序是什么对我来说并不重要。表中的行数在一天中在约 10K 到 500 万之间变化。符合条件的数量在 0 到 200 之间变化,因为我通常在查询后更新最终结果。如果我不是最新的,那么可以有超过 100K 的资格。
-
我得到 40K 行的索引扫描
-
我使用的是 9.1 版。当我说“start_time = '7/29/2012'”时,我能够成功使用索引,但这对我的查询没有帮助。当它比较不等式时,它不会选择索引。如果我从 postgres 读取的程序正常工作,那么 final = 0 的值应该始终在当前日期的 4 小时内,并且稍微超出 4 小时窗口。
-
使用部分索引 (
WHERE final=0) 我仍然得到索引扫描,结果在亚毫秒时间内,正常索引 100--200 毫秒,大约 250 万行更新:我会作为答案发布。
标签: performance postgresql datetime indexing