【问题标题】:Efficient database querying Rails高效的数据库查询 Rails
【发布时间】:2014-02-05 07:44:20
【问题描述】:

我正在使用带有 PostgreSQL 的 Rails 4,并且我有一个表 Quotes 会随机填充。有时两个条目相隔几毫秒,有时几小时(交易日结束)。我想建立一个过去 1 年的报价图表。

我现在正在使用

quotes = Quote.where(:created_at => 1.year.ago.beginning_of_day..Time.now.end_of_day).select(:price, :created_at)

这很好用,但我不需要(或想要)所有具有毫秒精度的数据。我想每隔 1 小时轮询一次数据库以获取 1 个报价,但我不确定如何构建查询。我当然可以从数据库中获取所有的报价,然后解析它们并丢弃大部分,但这似乎是在浪费资源和时间。

另外,如果这似乎是一种从数据库中获取报价的非常低效的方法,请告诉我。作为旁注,数据库服务器设置在主从配置中,这些引号读取请求来自从属。

【问题讨论】:

    标签: sql ruby-on-rails activerecord ruby-on-rails-4 rails-postgresql


    【解决方案1】:

    我不知道这是否是最好的解决方案,而且我还没有完全对它进行基准测试,但我想我会把它放在那里也许可以帮助其他处于类似情况的人。如果这不是一个格式正确的查询,请纠正我。

    def get_quotes_3months(stock_symbol)    
        @results = []
            ActiveRecord::Base.connection.select_all(
                ActiveRecord::Base.send(:sanitize_sql_array, ["
                select price, created_at, symbol
                from (
                    select price, created_at, symbol,
                           row_number() over (partition by date_trunc('hour', created_at) order by created_at) as r
                    from quotes
                    ) as dt
                where r = 1 AND created_at BETWEEN current_timestamp - INTERVAL '3 month' AND current_timestamp AND symbol = ?;", stock_symbol]
            )).each do |record|
    
                @results << {price: record["price"], created_at: record["created_at"].to_datetime}
            end
        return @results
    end
    

    基本上,我按小时将表划分为组,然后按 created_at 对每个组进行排序,并取每个组中的第一行。我还清理了查询,因为输入将来自 javascript ajax 请求(在此步骤之前已清理,但我构建了冗余以防万一)。

    最后要弄清楚的一件事是如何将分区更改为按其他时间范围分组(即,如果我希望每 15 分钟引用一次,那么调用 date_trunc('15 minute', created_at) 没有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多