SQLite3性能調整主要經過pragma指令來實現。數據庫
好比調整:空間釋放、磁盤同步、Cache大小等。緩存
一.空間釋放
1.如何查詢:安全
PRAGMA auto_vacuum;性能優化
含義:查詢數據庫的auto-vacuum標記。性能
2.標記含義:優化
auto-vacuum標記的含義:
正常狀況下,當提交一個從數據庫中刪除數據的事務時,數據庫文件不改變大小。未使用的文件頁被標記並在之後的添加操做中再次使用。這種狀況下使用VACUUM命令釋放刪除獲得的空間。可是Vacuum的效率很是低!
3.如何設置:spa
PRAGMA auto_vacuum = 0 | 1;調試
當開啓auto-vacuum,也就是執行pragma auto_vacuum=1;索引
當提交一個從數據庫中刪除數據的事務時,數據庫文件自動收縮, (VACUUM命令在auto-vacuum開啓的數據庫中不起做用)。數據庫會在內部存儲一些信息以便支持這一功能,這使得 數據庫文件比不開啓該選項時稍微大一些。事務
4.注意事項:
只有在數據庫中未建任何表時才能改變auto-vacuum標記。試圖在已有表的狀況下修改不會致使報錯。
5.建議:
不要打開。也就是「PRAGMA auto_vacuum = 0;」執行命令。
二.緩存大小
1.如何查詢:
PRAGMA cache_size;
查詢SQLite一次存儲在內存中的數據庫文件頁數。
2.標記含義:
每頁使用約1.5K內存,缺省的緩存大小是2000. 若須要使用改變大量多行的UPDATE或DELETE命令,而且不介意SQLite使用更多的內存的話,能夠增大緩存以提升性能。
3.如何設置
PRAGMA cache_size = Number-of-pages;
修改SQLite一次存儲在內存中的數據庫文件頁數。
4.注意事項:
當使用cache_size pragma改變緩存大小時,改變僅對當前對話有效,當數據庫關閉從新打開時緩存大小恢復到缺省大小。要想永久改變緩存大小,使用default_cache_size pragma.
5.建議:
修改成8000,也就是執行命令「PRAGMA cache_size =8000;」便可;
三.LIKE運算符
PRAGMA case_sensitive_like;
PRAGMA case_sensitive_like = 0 | 1;
標記含義:
LIKE運算符的缺省行爲是忽略latin1字符的大小寫。所以在缺省狀況下'a' LIKE 'A'的值爲真。能夠經過打開 case_sensitive_like pragma來改變這一缺省行爲。當啓用case_sensitive_like,'a' LIKE 'A'爲假而'a' LIKE 'a'依然爲真。
1.注意事項:
SQLite3.6.22版本不支持。
2.建議:
打開。也就是執行命令「PRAGMA case_sensitive_like = 1;」命令。否則搜索中文字串會出錯。
四.LIKE運算符
PRAGMA count_changes;
PRAGMA count_changes = 0 | 1;
查詢或更改count-changes標記。
正常狀況下INSERT, UPDATE和DELETE語句不返回數據。
當開啓count-changes,以上語句返回一行含一個整數值的數據——該語句插入,修改或刪除的行數。
1.注意事項:
返回的行數不包括由觸發器產生的插入,修改或刪除等改變的行數。
2.建議:
打開,便於調試。也就是執行「PRAGMA count_changes = 1;」該命令。
五.頁面大小
PRAGMA page_size;
PRAGMA page_size = bytes;
查詢或設置page-size值。
1.注意事項:
只有在未建立數據庫時才能設置page-size。頁面大小必須是2的整數倍且大於等於512小於等於8192。
上限能夠經過在編譯時修改宏定義SQLITE_MAX_PAGE_SIZE的值來改變。上限的上限是32768。
六.磁盤同步
1.如何查詢:
PRAGMA synchronous;
指令含義:查詢"synchronous"標記的設定,返回整數值;
2.如何設置:
PRAGMA synchronous = FULL; (2)
PRAGMA synchronous = NORMAL; (1)
PRAGMA synchronous = OFF; (0)
3.參數含義:
當synchronous設置爲FULL (2), SQLite數據庫引擎在緊急時刻會暫停以肯定數據已經寫入磁盤。這使系統崩潰或電源出問題時能確保數據庫在重起後不會損壞。FULL synchronous很安全但很慢。
當synchronous設置爲NORMAL, SQLite數據庫引擎在大部分緊急時刻會暫停,但不像FULL模式下那麼頻繁。 NORMAL模式下有很小的概率(但不是不存在)發生電源故障致使數據庫損壞的狀況。但實際上,在這種狀況 下極可能你的硬盤已經不能使用,或者發生了其餘的不可恢復的硬件錯誤。
設置爲synchronous OFF (0)時,SQLite在傳遞數據給系統之後直接繼續而不暫停。若運行SQLite的應用程序崩潰, 數據不會損傷,但在系統崩潰或寫入數據時意外斷電的狀況下數據庫可能會損壞。另外一方面,在synchronous OFF時 一些操做可能會快50倍甚至更多。
在SQLite 2中,缺省值爲NORMAL.而在3中修改成FULL。
4.建議:
若是有按期備份的機制,並且少許數據丟失可接受,用OFF。
七.內存模式
1.如何查詢:
PRAGMA temp_store;
指令含義:查詢"temp_store"參數的設置;
2.如何設置:
PRAGMA temp_store = DEFAULT; (0)
PRAGMA temp_store = FILE; (1)
PRAGMA temp_store = MEMORY; (2)
3.參數含義:
當temp_store設置爲DEFAULT (0),使用編譯時的C預處理宏 TEMP_STORE來定義儲存臨時表和臨時索引的位置。
當設置爲FILE (1),則存放於文件中。temp_store_directorypragma 可用於指定存放該文件的目錄。
當設置爲MEMORY (2),臨時表和索引則存放於內存中。
4.注意事項:
當改變temp_store設置,全部已存在的臨時表,索引,觸發器及視圖將被當即刪除。
5.建議:
使用2,即內存模式。
附指令表集:
序號 |
指令 |
含義 |
缺省值 |
1 |
auto_vacuum |
空間釋放 |
0 |
2 |
cache_size |
緩存大小 |
2000 |
3 |
case_sensitive_like |
LIKE大小寫敏感 |
(注意:SQLite3.6.22不支持) |
4 |
count_changes |
變動行數 |
0 |
5 |
page_size |
頁面大小 |
1024 |
6 |
synchronous |
硬盤大小 |
2 |
7 |
temp_store; |
內存模式 |
0 |
(End.)