2013-01-03 384 views
1

我有一个SQL查询,这是非常缓慢:PostgreSQL的查询速度很慢与::日期,时间::和间隔

 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秒返回所需的值(总是一个值)。我需要为一个任务执行数百个查询,所以这变得非常缓慢。 执行相同的查询,但不直接使用间隔和::日期指着时间,时间::只有17MS需要:

select number1 from mytable 
    where symbol = 25 
    and timeframe = 1 
    and date = '2008-02-05 11:10:00' 

我认为这将是,如果我不会用::日期和更快: :时间,但是当我执行如下查询时:

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没有帮助我。

表中的符号,时间范围,日期有多列索引。

有没有执行与增加时间,或间隔工作语法,我没有使用::日期和时间::查询的快捷方式?或者当我使用像这样的查询时需要有一个特殊的索引?

Postgresql版本是9.2。

编辑: 表格的格式是: date =带时区的时间戳, symbol,timeframe = numeric。

编辑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))" 

现在时间相当快:第一次运行86ms。

+0

并请发布完整的错误消息,不仅错误号。 –

+0

我只在符号,时间范围,日期上有多列索引。会为日期专门设置一个额外的索引吗?我认为多列索引就足够了。编辑:我看到我应该运行一个解释,看看我的索引是否正在使用。 – harbun

+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找出来。

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

+0

工程就像一个魅力。如果可以的话,会给答案速度+1。你介意看看解释并告诉我它是否按需要使用索引?我认为它确实,但我不确定我是否正确阅读。 – harbun

+0

@harbun:是的,它确实使用索引:*索引使用mytable上的mcbidindex扫描* –