如何从PgSQL DB获取时序

时间:2016-03-10 01:10:17

标签: ruby postgresql timing pg

我试图使用pg gem获取查询的时间。我看到了文档,但我没有找到任何内容。我想知道是否有像query.time这样的东西。

我将\timing添加到~/.psqlrc,因此该命令默认处于活动状态。如果我在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类。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

尽管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')