你如何在Ruby pg gem中使用PG :: Connection类的send_query?

时间:2012-07-28 10:53:26

标签: ruby multithreading postgresql query-optimization pg

如何在Ruby pg gem中使用send_query类的公共实例方法PG::Connection

它可以帮助加快像这样的程序的执行时间吗?

a = [1,2,3,4,5,6,...,100000]  # elements in no specific order
conn = PG.connect(OMITTED)
conn.transaction do |conn|
  a.each do |i]
    conn.exec("INSERT INTO numbers VALUES ($1)",[i])
  end
end

假设:如果我不等待结果,那么我可以继续向PostgreSQL服务器发送查询并尽快完成。

实验:重写版本:

a = [1,2,3,4]
conn = PG.connect(OMITTED)
conn.setnonblocking(true)
conn.transaction do |conn|
  a.each do |i]
    conn.send_query("INSERT INTO numbers VALUES ($1)",[i])
  end
end

结果:运行时间无差异。

其他一些问题:

  • 我的假设是否正确?
  • 这一定是线程的工作吗?
  • 我应该以某种方式处理exec的输出吗?

1 个答案:

答案 0 :(得分:3)

您是否尝试将所有SQL插件合并为一个?在我的实验中它更快:

require "rubygems"
require "pg"

a = (0...10000).sort_by(&:rand)  # elements in no specific order
conn = PG.connect(:dbname => "numbers")
t = Time.now
conn.transaction do |conn|
  a.each do |i|
    conn.exec("INSERT INTO numbers VALUES ($1)",[i])
  end
end
p Time.now - t

t = Time.now
conn.transaction do |conn|
  conn.exec(
    a.map { |i|
      "INSERT INTO numbers VALUES (%d);" % i
    }.join("")
  )
end
p Time.now - t

#=> 2.658903, 0.572997