【问题标题】:Postgresql Query very slow with ::date, ::time, and intervalPostgresql 查询非常慢:::date、::time 和间隔
【发布时间】: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


【解决方案1】:

第一个版本不会在名为 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 来确定它是否使用索引。

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

【讨论】:

  • 像魅力一样工作。如果可以的话,我会再给答案速度+1。您介意看一下解释并告诉我它是否根据需要使用索引吗?我认为确实如此,但我不确定我是否正确阅读。
  • @harbun:是的,它确实使用了索引:Index Scan using mcbidindex on mytable
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多