SQLiteでAutoCommitと通常のcommitってどれくらい早さに違いがあるのか

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弱といったところか。

 

スポンサードリンク

関連コンテンツ