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 挿入を 1 つに結合しようとしましたか? 私の実験では、より高速です:

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 に答える