次の2つのPythonコード例を考えてみましょう。Postgres:カーソルを使ったアップデートでの驚くべきパフォーマンス
import psycopg2, time
conn = psycopg2.connect("dbname=mydatabase user=postgres")
cur = conn.cursor('cursor_unique_name')
cur2 = conn.cursor()
startTime = time.clock()
cur.execute("SELECT * FROM test for update;")
print ("Finished: SELECT * FROM test for update;: " + str(time.clock() - startTime));
for i in range (100000):
cur.fetchone()
cur2.execute("update test set num = num + 1 where current of cursor_unique_name;")
print ("Finished: update starting commit: " + str(time.clock() - startTime));
conn.commit()
print ("Finished: update : " + str(time.clock() - startTime));
cur2.close()
conn.close()
そして:
import psycopg2, time
conn = psycopg2.connect("dbname=mydatabase user=postgres")
cur = conn.cursor('cursor_unique_name')
cur2 = conn.cursor()
startTime = time.clock()
for i in range (100000):
cur2.execute("update test set num = num + 1 where id = " + str(i) + ";")
print ("Finished: update starting commit: " + str(time.clock() - startTime));
conn.commit()
print ("Finished: update : " + str(time.clock() - startTime));
cur2.close()
conn.close()
テーブルテストの作成文は次のとおりです。
CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);
そして、そのテーブルは100000行とVACUUMはTESTをANALYZE含まれています。実行されました。
私は次の結果をいくつかの試みで一貫して得ています。
最初のコード例:
Finished: SELECT * FROM test for update;: 0.00609304950429
Finished: update starting commit: 37.3272754429
Finished: update : 37.4449708474
2番目のコード例:
これは私が思うだろうと私には非常に驚くべきことであるFinished: update starting commit: 24.574401185
Finished committing: 24.7331461431
は、カーソルを使用して、更新がなければならないことを意味し、全く逆であるべきですはるかに速くthis答えによると。