我有一个非常慢的 sql 查询:
select number1 from mytable
where symbol = 25
and timeframe = 1
and date::date = '2008-02-05'
and date::time='10:40:00' + INTERVAL '30 minutes'
目标是返回一个值,postgresql 需要 1.7 秒才能返回所需的值(总是一个值)。我需要为一项任务执行数百个这样的查询,所以这变得非常慢。执行相同的查询,但不使用interval和::date直接指向时间,::time只需要17ms:
select number1 from mytable
where symbol = 25
and timeframe = 1
and date = '2008-02-05 11:10:00'
我认为如果我不使用 ::date 和 ::time 会更快,但是当我执行如下查询时:
select number1 from mytable
where symbol = 25
and timeframe = 1
and date = '2008-02-05 10:40:00' + interval '30 minutes'
我收到一个 sql 错误 (22007)。我已经尝试了不同的变体,但如果不使用 ::date 和 ::time,我无法获得工作间隔。postgresql.org 上的日期/时间函数并没有帮助我。
该表有一个关于交易品种、时间范围、日期的多列索引。
有没有一种通过添加时间来执行查询的快速方法,或者有一个工作语法与我不必使用 ::date 和 ::time 的间隔?或者在使用这样的查询时我是否需要有一个特殊的索引?
Postgresql 版本是 9.2。
编辑:表格的格式是:日期=带有时区的时间戳,符号,时间范围=数字。
编辑 2:使用
select open from ohlc_dukascopy_bid
where symbol = 25
and timeframe = 1
and date = timestamp '2008-02-05 10:40:00' + interval '30' minute
解释显示:
“在 mytable 上使用 mcbidindex 进行索引扫描(成本=0.00..116.03 行=1 宽度=7)” " Index Cond: ((symbol = 25) AND (timeframe = 1) AND (date = '2008-02-05 11:10:00'::timestamp without time zone))"
时间现在大大加快:第一次运行 86 毫秒。