2012-03-18 102 views
0

我在一個只讀數據庫的iPhone應用程序中使用sqlite。 一個用例涉及發出大量select語句,每個語句返回大約3行。 不可能減少查詢的數量,因爲下一個查詢的參數取決於前一個查詢的結果。 查詢本身是相當簡單的:sqlite優化讀取性能

SELECT int1, int2, int3, int4 , int5, int6, int7 FROM sometable WHERE (int1 = ? AND int2 = ?) or (int3 = ? and int4 = ?) ORDER BY ROWID 

表具有索引(INT1,INT2)和索引(INT3,INT4)。所有int都有數據類型INTEGER

查詢通過C-API完成。語句使用sqlite3_prepare_v2()編譯並用於所有查詢。在每個查詢之後,語句中的sqlite3_reset()被執行,然後綁定新的參數。

使用標誌SQLITE_OPEN_READONLY和SQLITE_OPEN_NOMUTEX打開數據庫文件。

在IPhone剖析表明,時間很大一部分在sqlite3_step花費() - > sqlite3VdbeExec-> sqlite3BtreeBeginTrans-> sqlite3PagerSharedLock->線pVfs-> Xaccess文件()

我沒有sqlite的專家,但對我來說,看起來有時間浪費在不需要的鎖定上。 不需要,因爲它確保在查詢完成時沒有其他人訪問數據庫。 我也想知道sqlite3BtreeBeginTrans。是否爲選擇語句創建了事務?

誰能告訴我如何進一步優化?

回答

1

從sqlite的用戶郵件列表正確答案: http://sqlite.org/pragma.html#pragma_locking_mode

提速約40%......

+1

這是總結你的網頁連結點一個很好的做法,以防萬一鏈接將來無效,信息丟失。 – 2017-06-27 16:19:51