DISQLite的一些優化心得

  這段時間正在做的項目是DISQLite的數據讀寫,基本的邏輯都寫完了,但是性能方面不行。查了好幾天資料,看幫助文檔,得到了一些性能優化的心得,給大家分享一下:

先說寫的部分:

  1:寫數據的時候手動開啓事務

  FDataBase.StartTransaction();
  try
    //do something
    FDataBase.Commit;
  except
    FDataBase.Rollback;
  end;
   這樣的話,寫入的數據會得到極大的提升。StrartTransaction有三種模式:ttDeferred,ttImmediate,ttExclusive。但這模式MS跟寫入的速度無關,跟數據庫的鎖的狀態有關,詳細內容可以參考這篇http://www.cnblogs.com/frankliiu-java/archive/2010/05/31/1748160.html。

  2:clearBinds + Reset比Close快。

  這個有點白癡了,由於剛開始的時候沒仔細看幫助文檔,批量插入數據的時候都是Open,然後Close,結果也比較慢。後來的時候改成:

  oStmt := FDataBase.Prepare16(strInsert);
  try
    oStmt.Open;
    for I := 0 to 1000 do
    begin
      //do Insert
      oStmt.Step;
      oStmt.Clear_Bindings;
      oStmt.Reset;
    end;
  finally
    oStmt.Free;
  end;
打開一個新的連接肯定會比重置一個連接要慢。

3)設置CacheSize的值。

  默認的值是1024,可以考慮設置得大一點,如果不考慮內存的增加的話,網上找了找,有人建議設置成8000,具體的數值可以根據不同的應用,自己測試後再定。

4)autoAutoVacuum不要設置

  設置後,速度會慢,網上有的說的是效率會比較低。建議還是不要設置爲True。

 5:執行PRAGMA synchronous = off,可以提升一點速度。

讀的部分:

  1:給外鍵創建索引。

  如果外鍵的取值比較多的話,給它創建索引,速度會得很大的提升。取值比較少的話,可以沒必要加。這樣的話,執行Select語句的時候會快很多,寫的時候創建索引,對寫的速度基本沒有影響。

 2:SQLite有空值,讀的時候,用Column_Text(AIndex) = '' 或者Column_bytes(AIndex) = 0來判斷是否爲空,要比採用Column_str16(AIndex) = ''等要快很多。

 3:Select語句中,儘量不要用Select * From XXX,可能的話,還是隻寫所需要的字段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章