我有一个非常慢的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。
编辑: 表的格式是: date =带时区的时间戳, 符号,时间范围=数字。
编辑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
解释说明:
"Index Scan using mcbidindex on mytable (cost=0.00..116.03 rows=1 width=7)" " Index Cond: ((symbol = 25) AND (timeframe = 1) AND (date = '2008-02-05 11:10:00'::timestamp without time zone))"
现在时间相当快:首次运行时间为86毫秒。
答案 0 :(得分:4)
第一个版本不会在名为date
的列上使用(常规)索引。
您没有提供太多信息,但假设名为date
的列具有数据类型timestamp
(而不是date
),则以下内容应该有效:
and date = timestamp '2008-02-05 10:40:00' + interval '30 minutes'
这应该在名为date
的列上使用索引(但仅当它实际上是timestamp
而不是date
时)。它与你的基本相同,唯一的区别是显式时间戳文字(尽管Postgres 应理解'2008-02-05 10:40:00'
作为时间戳文字)。
您需要运行explain
以确定它是否正在使用索引。
请注意:更改该列的名称。使用保留字作为标识符是不好的做法,这是一个非常可怕的名称,它没有说明列中存储的信息类型。是“开始日期”,“结束日期”,“截止日期”,......?