【发布时间】:2018-03-17 07:18:43
【问题描述】:
我有这样的事情:
# pseudo code
while True:
result = make_request_for_data(my_http_request)
query = "INSERT INTO my_table (col1, col2) VALUES (%s, %s);"
for data in result:
cursor.execute(query, data)
connection.commit() # should this be inside while loop or outside?
if result is None: # some breaking mechanism
break
cursor.close()
connection.close()
有性能优势吗?为什么?我会做一些时间安排,但想知道为什么如果是这样的话,一个比另一个更好。
【问题讨论】:
-
这样会效率低下。更好的方法是将您的数据集分解为一个批量大小,您可以在其中插入 N 条记录,然后提交。您需要了解数据库正在为您做什么。它会创建一个您每次提交的回滚段。它不应该是一个记录;如果记录数很大,则不应为 N。
-
我建议,在while循环中concat所有的insert命令一起在数据库上执行一次,在数据库操作上,你去数据库的次数会是最贵的
-
@Serjik 澄清一下,您是否建议我连接我的查询,以便查询字符串是多个插入语句,然后运行
cursor.execute一次?在循环的每次迭代中,result最多保存 1000 条记录 - 是否存在 1000 条 INSERT 语句? -
@Petar 然后不管有没有事务,你都应该保留一个计数器,当它达到一定的数字(考虑 100*N)然后提交到数据库。然后您将少执行 100 次 DB 操作。
-
@Petar 这篇文章也应该对你有所帮助stackoverflow.com/questions/2741919/…
标签: python database postgresql performance psycopg2