Python 我应该在while循环内还是在while循环外提交数据库?

Python 我应该在while循环内还是在while循环外提交数据库?,python,database,postgresql,performance,psycopg2,Python,Database,Postgresql,Performance,Psycopg2,我有这样的想法: # 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

我有这样的想法:

# 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()

是否有绩效优势?为什么?我会做一些计时,但想知道为什么一个比另一个好,如果是这样的话。

这取决于时间,它取决于什么比性能更重要。问问自己:

整个循环是单个原子业务操作,还是循环的每个迭代都是单个原子业务操作

也就是说,假设您正在循环10条记录,而记录#5以某种方式失败。1-4还应该继续吗?如果是,请在循环内提交。如果不是,则在循环外提交


更改提交数据的位置确实会影响性能,但更重要的是,它会影响正在实现的系统的逻辑。

这取决于,它所依赖的内容比性能重要得多。问问自己:

整个循环是单个原子业务操作,还是循环的每个迭代都是单个原子业务操作

也就是说,假设您正在循环10条记录,而记录#5以某种方式失败。1-4还应该继续吗?如果是,请在循环内提交。如果不是,则在循环外提交



更改提交数据的位置确实会影响性能,但更重要的是,它会影响正在实现的系统的逻辑。

这样做效率低下。更好的方法是将数据集分解为一个批大小,在其中插入N条记录,然后提交。您需要了解数据库为您做了什么。它会创建一个回滚段,您每次提交该回滚段。它不应该是一张唱片;如果记录的数量很大,则不应为N。我建议,在while循环中,将所有insert命令放在一起,并在数据库上执行一次,在数据库操作中,您访问数据库的次数最多expensive@Serjik澄清一下,你是在建议我回答我的问题吗,这样,查询字符串就是多个insert语句,然后运行
游标。执行
一次?在循环的每次迭代中,
result
最多保存1000条记录-是否有1000条INSERT语句是一个问题?@Petar然后在有或没有事务时,您应该保留一个计数器,当它达到一定数量时(考虑100*N),然后提交到数据库。然后,您将减少100倍的DB操作。@Petar另外,本文对您应该有帮助,这样做效率会很低。更好的方法是将数据集分解为一个批大小,在其中插入N条记录,然后提交。您需要了解数据库为您做了什么。它会创建一个回滚段,您每次提交该回滚段。它不应该是一张唱片;如果记录的数量很大,则不应为N。我建议,在while循环中,将所有insert命令放在一起,并在数据库上执行一次,在数据库操作中,您访问数据库的次数最多expensive@Serjik澄清一下,你是在建议我回答我的问题吗,这样,查询字符串就是多个insert语句,然后运行
游标。执行
一次?在循环的每次迭代中,
result
最多保存1000条记录-是否有1000条INSERT语句是一个问题?@Petar然后在有或没有事务时,您应该保留一个计数器,当它达到一定数量时(考虑100*N),然后提交到数据库。然后,您将少执行100次DB操作。@Petar另外,本文对您也会有所帮助。
result
将在每次迭代中最多保存1000条记录。如果其中一个失败,其他的仍然有效。所以我猜每个迭代都是原子的。@Petar:如果每个迭代都是原子的,那么听起来除了在循环中提交之外,没有什么别的选择了。性能可能会受到影响,但出于实现预期逻辑的目的。此时提高性能需要研究一些更快的提交机制,例如提交到消息队列而不是数据库,以及让一个单独的进程读取队列并提交到数据库。但这当然取决于这个过程的最终结果是什么,以及为什么性能是一个问题。例如,如果这需要快速返回到用户界面,那么它不需要绑定到用户界面,所以它不需要非常快。我目前正在使用它将一些数据推送到测试数据库中。我想,如果我想从现在开始提高性能,我应该看看批量插入(?)@Petar:批量插入可能会更快,是的。它将把整个操作变成一个单一的原子操作。从这个描述来看,这听起来是一个可以接受的改变?如果是这样的话,那么如果性能确实是一个难点,那么这可能值得一看。
result
将在每次迭代中最多保存1000条记录。如果其中一个失败,其他的仍然有效。所以我猜每个迭代都是原子的。@Petar:如果每个迭代都是原子的,那么听起来除了在循环中提交之外,没有什么别的选择了。性能可能会受到影响,但出于实现预期逻辑的目的。此时提高性能需要研究一些更快的提交机制,例如提交到消息队列而不是数据库,以及让一个单独的进程读取队列并提交到数据库。但这当然取决于这个过程的最终结果是什么,以及为什么性能是一个问题。例如,如果这需要快速返回到用户界面,那么它不需要绑定到用户界面,所以它不需要非常快。我目前正在使用它将一些数据推送到测试数据库中。我想,如果我想从现在开始提高性能,我应该看看批量插入(?)@Petar:批量插入可能会更快,是的。它将把整个操作变成一个单一的原子操作。从这个描述来看,这听起来是一个可以接受的改变?如果是这样,那可能是麦汁