优化SELECT从Oracle到INSERT到SQLite(在Python3中)

时间:2017-06-20 17:54:59

标签: python-3.x sqlite cx-oracle

我有一个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行/秒。前三分钟网络活动激增,但一旦从上面打印出第二个日期时间,就没有网络活动,这让我相信瓶颈是我编码的东西。我的代码插入效率低吗?如果是这样,有没有更好的方法来获得我之后的目标?

1 个答案:

答案 0 :(得分:2)

fetchall()将所有数据加载到内存中。这不是必需的,因为executemany可以与任何迭代器一起使用;将oracle_cursor.fetchall()替换为oracle_cursor

还要确保您使用的是单笔交易。 (如果已启用自动提交模式,则应明确启动事务。)