2017-06-20 73 views
0

我有一個Oracle數據庫,我將數據的一個子集提取到本地SQLite數據庫中。我的代碼基本上如下:優化SELECT從Oracle到INSERT到SQLite(在Python3中)

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

它確實需要它,但它需要比我想要的更長的時間。在3分鐘左右,Oracle部分的執行速度實際上非常快。但插入需要更長的時間。我已經玩過SQLite設置,如緩衝區設置等。似乎沒有任何事情能夠突破50行/秒。前三分鐘的網絡活動高峯,但一旦從上面打印第二個日期時間,就沒有網絡活動,這使我相信瓶頸是我編碼的東西。我的代碼在插入時效率低下嗎?如果是這樣,有沒有更好的方式來獲得我所追求的?

回答

2

fetchall()將所有數據加載到內存中。這不是必須的,因爲executemany可以與任何迭代器一起使用;將oracle_cursor.fetchall()替換爲oracle_cursor

還要確保您使用的是單個事務。 (如果您啓用了自動提交模式,則應明確啓動事務處理。)

+0

對於其他有此問題的人員:此操作稍微加快了寫入時間/行數。我仔細觀察網絡流量,結果發現數據庫和我的機器之間存在問題。我只是假設*沒有數據被傳輸。事實證明,在任務管理器中的網絡選項卡的圖表中沒有顯示傳輸的數據量非常小*。我通過用for循環打印光標中的每一行代替插入命令發現了這一點。每次印刷的印刷數量與印刷完全相同*,因此這可能是此場景的最佳選擇。 – mkingsbu