Sqlite大資料寫入效能優化

2021-10-12 01:39:34 字數 1652 閱讀 2307

眾所周知,sqlite是乙個輕量級的資料庫,僅僅需要乙個exe檔案就能執行起來。在處理本地資料上,我比較喜歡選擇使用它,不僅是因為他與sql server有著比較相近的語法,還因為它不需要安裝,僅需要通過命令列就能啟動了,而且他在處理大資料時,效能比sql server好很多,好吧這裡不繼續爭論效能優劣。

首先,這次的問題是在一次專案中遇到的,專案要求能大量匯入資料,而且由於專案性質(輕便,本地化),所以我選擇sqlite來存放資料。

第一版**:

1 stringbuilder sql = new stringbuilder();

2 foreach (datarow dr in dt.rows)

3 6 sqlhelper.sqlitehelper.executenonquery( sql.tostring(), commandtype.text);

從上面的**看來,我沒有進行任何優化工作,我用這種方式插入了1萬條資料用了1分多鐘,可見優化的重要性(百萬級資料跑起來...不敢想象)。

開啟事務:

1 stringbuilder sql = new stringbuilder();

3 foreach (datarow dr in dt.rows)

4 8 sqlhelper.sqlitehelper.executenonquery( sql.tostring(), commandtype.text);

由於sqlite的資料操作實質上是對於其資料檔案的io操作,頻繁的插入資料會導致檔案io經常開閉,非常損耗效能能。事務作用便是使資料先快取在系統中,提交事務時便提交所有的更改到資料檔案,此時資料檔案的io只需要開閉一次,且避免了長期占用檔案io所導致效能低下的問題。此時,開啟事務處理後效能上雖然有了大幅度的提公升,但是結果仍舊不理想,哪還有什麼在影響著效能呢?下面嘗試開啟預處理來解決問題。

開啟預處理:

1  public static int executenonquery(string commandtext, commandtype commandtype)

2

16 catch (exception ex)

17

20 }

21 return result;

22 }

23

預處理的原理就是將一條語句先預編譯到資料庫,下次再次執行相同的語句時,就不用再次編譯,節省了大量的時間。由此看來,**似乎還沒有優化完成。就第一版**來說,由於批量插入的資料不盡相同,所以資料庫會多次編譯插入語句,效能會損耗非常多,也就造成插入需要的時間會比較多。有沒有一條語句是可以迴圈使用的?答案是有的,使用引數化傳值,就能使每一次的插入的sql語句都是相同的。

引數化(資料庫幫助類那邊我就不寫了):

1 stringbuilder sql = new stringbuilder();

2 sqliteparameter sp = new sqliteparameter[2];

3 foreach (datarow dr in dt.rows)

4

經過一系列優化處理後,插入1萬條資料只需要不到1秒,效能得到了極大的提公升。

另外,本人新手,如有不對,望不吝指教。

SQLite批量資料寫入優化方法

sqlite的資料庫本質上來講就是乙個磁碟上的檔案,所以一切的資料庫操作其實都會轉化為對檔案的操作,而頻繁的檔案操作將會是乙個很好時的過程,會極大地影響資料庫訪問的速度。例如 向資料庫中插入100萬條資料,在預設的情況下如果僅僅是執行 sqlite3 exec db,insert into name...

SQLite效能優化

最近做了乙個專案,在系統啟動時會更新幾千條資料,剛開始就使用最簡單的寫法,直接的insert,delete,導致這個更新過程進行了300多秒,後來經查得知在處理大量資料的時候新增上事務管理,會大大的提高效能,隨後就查閱資料如何來新增事務管理。這ios的sqlite和android上面的語法真是相差很...

sqlite 效能優化

比如 空間釋放 磁碟同步 cache大小等。不要開啟。前文提高了,vacuum的效率非常低!pragma auto vacuum pragma auto vacuum 0 1 查詢或設定資料庫的auto vacuum標記。正常情況下,當提交乙個從資料庫中刪除資料的事務時,資料庫檔案不改變大小。未使用...