Sean's Note: [sqlite3] Auto-commit will be inefficient for multiple SQL statements.

2015年8月4日 星期二

[sqlite3] Auto-commit will be inefficient for multiple SQL statements.

我們通常會用下列的程式碼來建立 DB 的連線,並指明是 auto-commit 的。

# Set isolation_level=None to use auto-commit
conn = sqlite3.connect('example.db', isolation_level=None)

來實驗看看執行 10000 次 INSERT 的敘述,

for i in range(0, 10000):
    conn.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")

居然要 657 秒!! 
因為每一筆 INSERT 都是一筆 Transaction,太花時間了,
所以如果我們只建立一筆 Transaction,
然後把 Statements 都塞到同一個 Transaction 再執行:

conn.execute("BEGIN IMMEDIATE TRANSACTION");
# Insert a row of data
for i in range(0, 10000):
    conn.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
conn.execute("COMMIT TRANSACTION");

結論: 發現只要 0.17 秒,差了快 400 倍啊!!

沒有留言:

張貼留言