我有一个Oracle数据库,我将一部分数据提取到本地SQLite数据库中。我的代码基本上如下:
print(datetime.datetime.now())
#Oracle portion of the script
sql = '''select [columns] from [table] where [condition]'''
oracle_cursor.execute(sql)
print(datetime.datetime.now())
#SQLite portion of the script
sqlite_conn.executeany('''INSERT into [table]
([columns])
values (?,?,?...etc.)''',
oracle_cursor.fetchall()
)
sqlite_conn.commit()
sqlite_conn.close()
它确实需要它,但它需要的时间比我想要的要长。 Oracle部分的执行实际上在3分钟左右就出乎意料地快了。但插入需要更长的时间。我已经玩过SQLite设置,如缓冲区设置等。似乎没有什么打破50行/秒。前三分钟网络活动激增,但一旦从上面打印出第二个日期时间,就没有网络活动,这让我相信瓶颈是我编码的东西。我的代码插入效率低吗?如果是这样,有没有更好的方法来获得我之后的目标?
答案 0 :(得分:2)
fetchall()
将所有数据加载到内存中。这不是必需的,因为executemany
可以与任何迭代器一起使用;将oracle_cursor.fetchall()
替换为oracle_cursor
。
还要确保您使用的是单笔交易。 (如果已启用自动提交模式,则应明确启动事务。)