2017-08-08 239 views
0

我需要將大量數據插入到sqlite數據庫中。數據被連續接收。使用SQlite批量插入

最好是:準備語句,開始一個事務,做一些插入,在一定量的插入結束事務之後,重複循環或者緩存數據,偶爾打開db,做批量插入,關閉db ,繼續緩存?

是否有任何其他提示如何以最有效的方式做到這一點?

+0

如果通過「批量插入」,您的意思是構建一個含有大量「VALUES」條目的龐大的INSERT語句,那麼這幾乎肯定不是這樣。也不會有大量的隱式事務INSERT語句。這使得準備好的語句插入批處理事務中,在這種情況下,數據源是來自「傳入流」還是緩存可能沒有多大區別。 – TripeHound

+0

如果您的表具有索引,並且其他因素允許,則刪除它們並(重新)在最後創建它們比在整個批量更新中維護它們更快。但是如上所述,影響速度的因素有很多,所以總是推薦使用不同方法的基準。 – TripeHound

+0

在HDD中累積數據將比在HDD中這樣做效率更高。所以你必須考慮你的內存需求,並且可能在RAM中積累時丟失數據。 – Megamozg

回答

1

你的兩種情況唯一的區別是你正在關閉數據庫連接。這通常不是一個好主意,因爲它會丟棄頁面緩存。 只有當您的內存非常少且真的需要其他東西時,關閉連接纔有用。

重要的是把許多插入到一個單一的事務,但你已經這樣做。

問題是有多少插入屬於一個事務。 如果您可以並行執行接收和數據庫操作,那麼您應該只需插入自上次批次以來收到的所有數據。 (這將導致連續的數據庫操作。) 爲更長的定時器緩存數據是沒有意義的,除非您想避免執行太多的磁盤I/O操作。

如果您有一定的性能要求,那麼您必須測量自己。

+0

「......沒有意義,除非你想避免做太多的磁盤I/O」。減少磁盤IO操作的數量可以提高性能。這是有道理的,因爲表現是有問題的。 – Megamozg

+0

@Megamozg在DB操作與其他東西並行完成的情況下,磁盤I/O的數量與性能無關。如果其他I/O也需要磁盤,那麼這種情況下你想避免從數據庫中做太多事情。 –