【问题标题】:How to get timing from the PgSQL DB如何从 PgSQL DB 获取时间
【发布时间】:2016-06-24 15:59:12
【问题描述】:

我正在尝试使用 pg gem 获取查询的时间。我看到了文档,但我没有找到任何东西。我想知道是否有类似query.time 的东西。

我在~/.psqlrc 中添加了\timing,因此该命令默认处于活动状态。如果我在 Postgres 控制台中编写查询,则时间处于活动状态。

这是代码:

conn = PGconn.open(:dbname => 'my_db') 
query=conn.exec('SELECT * from some_table')
puts query.num_tuples -> this work
puts query.time  -> undefined method

我需要测量 Postgres 本身的时间,我不能使用 Ruby 的 Time 类。

【问题讨论】:

    标签: ruby postgresql timing pg


    【解决方案1】:

    试试这个,因为它应该返回时间。

    puts conn.exec("EXPLAIN ANALYZE SELECT * FROM some_table").values

    【讨论】:

    • 这似乎不正确。对于我的查询,EXPLAIN ANALYZE 返回 100 毫秒,但在 PSQL 控制台中使用 \timing 时,查询报告为 5,000 毫秒。
    • 原来是\timing包含网络时间,而EXPLAIN ANALYZE没有。
    【解决方案2】:

    虽然PGconn.open(:dbname => 'my_db')conn.exec 似乎可以工作,但它不能正确报告执行时间。我怀疑它会报告除查询之外的其他内容的执行时间。也许是 EXPLAIN 的执行时间。

    虽然问题没有指定 Rails,但我怀疑在没有 Rails 的情况下使用 PGconn 会出现同样的问题。

    PGconn.open(:dbname => 'my_db') 总是报告 0.010 到 0.285 毫秒之间的执行时间。我的查询的正确执行时间约为 15,000 毫秒。

    要获得正确的执行时间,请使用:

    ActiveRecord::Base.connection.execute("EXPLAIN ANALYZE ...").values.last.first 
    

    提取数值:

    ActiveRecord::Base.connection.execute("EXPLAIN ANALYZE ...").values.last.first.scan( /\d+.\d+/ ).first
    

    就OP而言,

    conn = ActiveRecord::Base.connection
    conn.execute('EXPLAIN ANALYZE SELECT * from some_table')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2013-12-09
      • 2020-02-18
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      相关资源
      最近更新 更多