2018年11月10日土曜日

PostgreSQLでAutocomittをONOFFで比較する

Postgres公式ページにも書いてありますが、オートコミットを使うと遅くなります。どれくらいか、というのを調べました。


#!/usr/bin/python
import psycopg2
import sys
conn_string = "host='localhost' dbname='my_database' user='postgres' password = 'postgres'"
print("Connecting to database\n ->%s" % (conn_string))
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
print("Connected!\n")

これで接続したところからスタートします。適当にテーブルを作ります。列名はt0, time, v0, v1としています。テーブルが空の状態から1000回同じデータを入れてみます。

import time
import numpy as np
import pandas as pd
# init, drop if exists
cursor.execute('DROP TABLE IF EXISTS table1')
cursor.execute('CREATE TABLE table1 (t0 text, time timestamptz, v0 integer, v1 integer);')

Autocomitt OFF


conn.autocommit = False
start_time = time.time()
for i in range(1000):
    cursor.execute('''INSERT INTO table1 (t0, time, v0, v1)
                        VALUES (%s, %s, %s, %s)''',
                        ('test', '2017-10-10 09:10:15', 1, 0))
elapsed_time = time.time() - start_time
print("elapsed time: {}".format(elapsed_time) + "[sec]")
conn.commit()
elapsed time: 0.07536649703979492[sec]

Autocomitt ON

conn.autocommit = True
start_time = time.time()
for i in range(1000):
    cursor.execute('''INSERT INTO table1 (t0, time, v0, v1)
                        VALUES (%s, %s, %s, %s)''',
                        ('test', '2017-10-10 09:10:15', 1, 0))
elapsed_time = time.time() - start_time
print("elapsed time: {}".format(elapsed_time) + "[sec]")
elapsed time: 10.754042863845825[sec]

オートコミットON ・・・ 10.8秒
オートコミットOFF・・・  0.075秒

ということで、1000回挿入で10倍ほどの差が出ることが分かりました。

0 件のコメント:

コメントを投稿