2013-04-30 91 views
2

我想從iOS設備上只讀模式下使用的SQLite DB獲得最大性能。到目前爲止,我發現這些東西會對性能產生積極的影響:SQLite在多線程環境中的只讀優化

sqlite3_exec(ret, "BEGIN TRANSACTION", NULL, NULL, NULL); // open transaction after open DB and close transaction before close DB 
sqlite3_exec(ret, "PRAGMA journal_mode = OFF", NULL, NULL, NULL); 
sqlite3_exec(ret, "PRAGMA cache_size = 20000;", NULL, NULL, NULL); 
sqlite3_exec(ret, "PRAGMA locking_mode = EXCLUSIVE", NULL, NULL, NULL); 

我有20-25%的性能提升比較原始的版本,而上述編譯指示。

還有什麼可以幫助提升性能嗎?我擔心的一件事是即使它只是只讀訪問我有多個線程可以從數據庫讀取數據,使用以上多線程場景的編譯指示安全嗎?

回答

1

確保您對所有重要查詢都有適當的索引。

您應該在創建數據庫之後VACUUM

只有在配置了可能影響事務的參數後,才應該啓動事務。

從同一個數據庫讀取的多線程工作得很好。如果任何線程曾嘗試寫入,則會發生問題。)

如果您的查詢只讀取表格列的子集,則可以通過爲這些列創建covering index來加速它們;這允許SQLite避免讀取不需要的列的值。 但是,如果有任何其他查詢讀取其他列,則覆蓋索引和原始表都必須讀入緩存中,這會降低整體性能。

+0

謝謝,我有適當的索引,會嘗試VACUUM。你知道與你的表現有什麼不同嗎?只閱讀需要的列與所有列?什麼參數可以影響交易? – iKiR 2013-05-01 00:09:26