0

如何在 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 的输出吗?
4

1 回答 1

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
于 2012-07-28T12:34:02.177 回答