PythonでSQLiteを使うスクリプトを作ったけれども、
AutoCommitと通常のCommitはどれほどの処理速度の違うがあるんだろう。
ちょっと試してみた。
処理内容は
1.コネクトとクローズは一回のみで100回ループ
2.つどコネクトとクローズを繰り返して100回ループ
3.自動コミット
import sqlite3 from datetime import datetime import os dbnames = ["test1.db", "test2.db","test3.db"] limitnum = 100 def init(): sql = "create table hogetbl(HOGEID INTEGER PRIMARY KEY AUTOINCREMENT , NAME TEXT);" for d in dbnames: con = sqlite3.connect(d) con.execute(sql) con.commit() con.close() def main(): init() sql = "insert into hogetbl(NAME) values('hel')" time1 = datetime.now() con = sqlite3.connect(dbnames[0]) for i in range(limitnum): con.execute(sql) con.commit() con.close() time2 = datetime.now() for i in range(limitnum): con = sqlite3.connect(dbnames[1]) con.execute(sql) con.commit() con.close() time3 = datetime.now() con = sqlite3.connect(dbnames[2],isolation_level = None) for i in range(limitnum): con.execute(sql) con.close() time4 = datetime.now() print(time2 - time1) print(time3 - time2) print(time4 - time3) if __name__ == '__main__': main()
実行をするとこんな感じ
0:00:16.317748 手動コミット
0:00:16.950442 手動コミットで都度コネクトを実施
0:00:16.583024 自動コミット
うむー、予想よりあまり差は開かないな。
そりゃそうだ。
自動コミットにしても手動コミットにしても、クエリ発行後にすぐコミットしているのだから
ちょっと変更をしてみた。
import sqlite3 from datetime import datetime import os dbnames = ["test1.db", "test2.db","test3.db"] limitnum = 100 def init(): sql = "create table hogetbl(HOGEID INTEGER PRIMARY KEY AUTOINCREMENT , NAME TEXT);" for d in dbnames: con = sqlite3.connect(d) con.execute(sql) con.commit() con.close() def main(): init() sql = "insert into hogetbl(NAME) values('hel')" time1 = datetime.now() con = sqlite3.connect(dbnames[0]) for i in range(limitnum): con.execute(sql) con.commit() con.close() time2 = datetime.now() for i in range(limitnum): con = sqlite3.connect(dbnames[1]) con.execute(sql) con.commit() con.close() time3 = datetime.now() con = sqlite3.connect(dbnames[2],isolation_level = None) for i in range(limitnum): con.execute(sql) con.close() time4 = datetime.now() print(time2 - time1) print(time3 - time2) print(time4 - time3) if __name__ == '__main__': main()
一回目の処理をコミットを100行インサートしたあとに実施するようにしてみた。
ループから外すのにインデントを左にずらすだけでOKなんて、Pythonは手軽でいいね。
そして結果はこちら
0:00:00.156888 手動コミットで100回クエリ発行後コミット
0:00:16.349800 都度コネクト、都度コミットで100回ループ
0:00:16.860508 100回ループの自動コミット
なるほど、コミット回数が少ない方が早いな。
コミットをするたびにディスクにアクセスしているからその分遅くなるのだろう。
100回コミットをした場合は16秒で、1回コミットをした場合は0.15秒
このマシンでのディスクアクセスにかかる秒数は0.15弱といったところか。