Postgresql查询与:: date,:: time和interval非常慢

时间:2013-01-03 09:23:43

标签: postgresql

我有一个非常慢的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毫秒。

1 个答案:

答案 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以确定它是否正在使用索引。

请注意:更改该列的名称。使用保留字作为标识符是不好的做法,这是一个非常可怕的名称,它没有说明列中存储的信息类型。是“开始日期”,“结束日期”,“截止日期”,......?