天天看點

2010年SQLite3學習筆記之四(性能優化篇)

SQLite3性能優化

2010年SQLite3學習筆記之四(性能優化篇)

引言:

SQLite3性能調整主要通過pragma指令來實作。

比如調整:空間釋放、磁盤同步、Cache大小等。

一.空間釋放

1.如何查詢:

PRAGMA auto_vacuum;

含義:查詢資料庫的auto-vacuum标記。

2.标記含義:

auto-vacuum标記的含義:

正常情況下,當送出一個從資料庫中删除資料的事務時,資料庫檔案不改變大小。未使用的檔案頁被标記并在以後的添加操作中再次使用。這種情況下使用VACUUM指令釋放删除得到的空間。但是Vacuum的效率非常低!

3.如何設定:

PRAGMA auto_vacuum = 0 | 1;

當開啟auto-vacuum,也就是執行pragma auto_vacuum=1;

當送出一個從資料庫中删除資料的事務時,資料庫檔案自動收縮, (VACUUM指令在auto-vacuum開啟的資料庫中不起作用)。資料庫會在内部存儲一些資訊以便支援這一功能,這使得 資料庫檔案比不開啟該選項時稍微大一些。

4.注意事項:

隻有在資料庫中未建任何表時才能改變auto-vacuum标記。試圖在已有表的情況下修改不會導緻報錯。

5.建議:

不要打開。也就是“PRAGMA auto_vacuum = 0;”執行指令。

二.緩存大小

PRAGMA cache_size;

查詢SQLite一次存儲在記憶體中的資料庫檔案頁數。

每頁使用約1.5K記憶體,預設的緩存大小是2000. 若需要使用改變大量多行的UPDATE或DELETE指令,并且不介意SQLite使用更多的記憶體的話,可以增大緩存以提高性能。

3.如何設定

PRAGMA cache_size = Number-of-pages;

修改SQLite一次存儲在記憶體中的資料庫檔案頁數。

當使用cache_size pragma改變緩存大小時,改變僅對目前對話有效,當資料庫關閉重新打開時緩存大小恢複到預設大小。要想永久改變緩存大小,使用default_cache_size pragma.

修改為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,以上語句傳回一行含一個整數值的資料——該語句插入,修改或删除的行數。

傳回的行數不包括由觸發器産生的插入,修改或删除等改變的行數。

打開,便于調試。也就是執行“PRAGMA count_changes = 1;”該指令。

五.頁面大小

PRAGMA page_size;

PRAGMA page_size = bytes;

查詢或設定page-size值。

隻有在未建立資料庫時才能設定page-size。頁面大小必須是2的整數倍且大于等于512小于等于8192。

上限可以通過在編譯時修改宏定義SQLITE_MAX_PAGE_SIZE的值來改變。上限的上限是32768。

六.磁盤同步

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。

七.記憶體模式

PRAGMA temp_store;

指令含義:查詢"temp_store"參數的設定;

PRAGMA temp_store = DEFAULT; (0)

PRAGMA temp_store = FILE; (1)

PRAGMA temp_store = MEMORY; (2)

當temp_store設定為DEFAULT (0),使用編譯時的C預處理宏 TEMP_STORE來定義儲存臨時表和臨時索引的位置。

當設定為FILE (1),則存放于檔案中。temp_store_directorypragma 可用于指定存放該檔案的目錄。

當設定為MEMORY (2),臨時表和索引則存放于記憶體中。

當改變temp_store設定,所有已存在的臨時表,索引,觸發器及視圖将被立即删除。

使用2,即記憶體模式。

附指令表集:

序号

指令

含義

預設值

1

auto_vacuum

空間釋放

2

cache_size

緩存大小

2000

3

case_sensitive_like

LIKE大小寫敏感

(注意:SQLite3.6.22不支援)

4

count_changes

變更行數

5

page_size

頁面大小

1024

6

synchronous

硬碟大小

7

temp_store;

記憶體模式

(End.)