2017-09-23 120 views
0

我有一個SQLite的問題。看起來每個通話都需要〜300ms才能執行。經過一些測試後,我注意到延遲是由交易引起的。隱式事務的8次正常插入大約需要2秒,但是,如果我在插入之前啓動一個事務並在之後提交,我可以在同一時間內執行近百萬次插入。受影響的調用包括DROP TABLE,CREATE TABLE,INSERT,我也假設其他人(可能所有這些都隱含地開始一個事務)。SQLite C++ API交易緩慢

一些更多的信息:

  • 從網上下載SQLite的網站源合併(3200100)
  • 編譯它使用Visual Studio成靜態庫(不使用任何編譯器標誌,雖然我一直在玩弄與他們沒有運氣)
  • 我使用sqlite3_open16其次sqlite3_prepare16_v3然後sqlite3_step開始執行和/或接收的第一個結果
  • 沒有多線程,沒有從多個進程訪問,數據庫文件是exclus通過這個程序打開
  • 如果我在我的SSD(960 EVO)上創建文件,而不是「事務延遲」從300ms降低到10ms。儘管如此,仍然是一個荒謬的高價值,但我覺得我的磁盤的速度不應該影響減緩交易的速度?
  • 阻塞的函數是sqlite3_step(這也讓我不得不調用一個名稱的函數來執行DROP TABLE,但並不重要)
  • 編輯:在事務處理期間, CPU使用率爲100%。

在附註上,如果您知道表中的每一行都將完全是64字節,那麼是否可以通過組織數據來「幫助」SQLite?

我希望你能幫助我,或者推薦一個替代品(關係型,C++ api,基於文件,高性能) 非常感謝!

+0

DROP和CREATE TABLE可能非常昂貴,因爲除非創建新數據庫或對現有數據庫模式進行復雜升級,否則執行這兩個命令是不正常的。 DROP/CREATE還必須對數據庫元數據(模式)進行大量更改/檢查。 INSERT應該很快,除非在表上有許多索引/外鍵。 –

+1

這是[FAQ](http://www.sqlite.org/faq.html#q19)。考慮使用[WAL模式](http://www.sqlite.org/wal.html),它可以異步寫入。 –

回答

3

SQLite做了很多努力來確保它不會遭受數據損壞,所以對於隱式事務,您受到硬盤速度的限制。

隨着事務時,數據被寫入到其它位置,並且僅提交到磁盤一次,所以更快

sqlite speed

隨着同步導通,SQLite的執行一個FSYNC()系統調用(或等價)來確定關鍵數據實際上已寫入磁盤驅動器表面。

當創建一個事務時,數據被寫入其他文件,並且只有當所有的數據被提交時,fsync費用纔會被支付,並且一起支付。這是該部分配置的價格。從這一點來看,我從來沒有因爲腐敗而遭受sqlite數據丟失。

我覺得我的磁盤的速度不應該影響減慢交易的速度嗎?

這是一個重要的交易。如果你想提高數據完整性,那麼你的磁盤速度是相關的。

提交交易需要多長時間?

sqlite faq :19 why are transactions slow

的SQLite會很容易做到的平均桌面計算機上每秒5萬個以上的INSERT語句。但它每秒只能做幾十個事務。

您可以: -

  1. 使用事務綁定更多的工作。成本是每筆交易,因此可以膨脹。
  2. 使用臨時表。臨時表不會影響性能,並且會全速運行。
  3. 不推薦。使用PRAGMA synchronous=OFF禁用同步寫入。
+0

將日誌模式設置爲WAL確實是我想要的(從一致性角度和性能角度來看)。這些值現在變得更有意義,在普通硬盤上每秒處理32個事務,在SSD上處理超過512個事務。非常感謝,我不能相信我錯過了常見問題解答中的信息! –