【发布时间】:2013-01-03 09:23:42
【问题描述】:
我有一个很慢的 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 毫秒。
【问题讨论】:
-
请发布完整的错误消息,而不仅仅是错误号。
-
我只有一个关于交易品种、时间范围、日期的多列索引。专门用于日期的额外索引是否有意义?我认为多列索引就足够了。编辑:我知道我应该运行一个解释,看看我的索引是否正在被使用。
-
取决于索引的定义方式。索引中的第一个列是哪一列?请发布完整的表定义,包括索引和执行计划
-
索引按交易品种、时间范围、日期的顺序排列,与查询使用的顺序相同。
标签: postgresql