如何从PgSQL数据库获取时间?

3
我想使用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类。

2个回答

3

尝试执行以下代码,它会返回时间结果。

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


这似乎不正确。对于我的查询,EXPLAIN ANALYZE 返回100ms,但是在PSQL控制台中使用\timing时,查询报告为5,000ms。 - B Seven
事实证明,\timing 包括网络时间,而 EXPLAIN ANALYZE 则不包括。 - B Seven

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接