Sqlite 快取引數在下文中查詢:資料庫一般執行在嵌入式環境中,需要兼顧效能和硬體資源。
SQLite 使用 PRAGMA 命令在 SQLite 環境內控制各種環境變數和狀態標誌。一個 PRAGMA 值可以被讀取,也可以根據需求進行設定。主要介紹幾個在嵌入式開發中經常使用的關鍵引數。
synchronous
synchronous Pragma 獲取或設定當前磁碟的同步模式,該模式控制積極的 SQLite 如何將資料寫入物理儲存。也就是說該引數控制何時執行sync指令。
Pragma 值描述0 或 OFF不進行同步。1 或 NORMAL在關鍵的磁碟操作的每個序列後同步。2 或 FULL在每個關鍵的磁碟操作後同步。
當synchronous設定為FULL (2), SQLite資料庫引擎在緊急時刻會暫停以確定資料已經寫入磁碟。這使系統崩潰或電源出問題時能確保資料庫在重起後不會損壞。為了保證資料的安全性,該項建議設定為FULL。
journal_mode
journal_mode Pragma 獲取或設定控制日誌檔案如何儲存和處理的日誌模式。
Pragma 值描述DELETE預設模式。在該模式下,在事務結束時,日誌檔案將被刪除。TRUNCATE日誌檔案被階段為零位元組長度。PERSIST日誌檔案被留在原地,但頭部被重寫,表明日誌不再有效。MEMORY日誌記錄保留在記憶體中,而不是磁碟上。OFF不保留任何日誌記錄。
首先補充一個知識點,SQLite中日誌模式主要有DELETE和WAL兩種,其中WAL(Write ahead logging)是一種日誌模式,它是一種思想,普遍應用於關係型資料庫。每個事務執行變更時,修改資料頁,同時會產生日誌,這樣在事務提交後,不需要將修改的髒頁刷盤,只需要將事務產生的日誌落盤即可返回。WAL保證日誌一定先於對應的髒頁落盤,就是所謂的WAL。
DELETE模式採用影子分頁技術(Shadow paging),DELETE模式下,日誌中記錄的變更前資料頁內容;WAL模式下,日誌中記錄的是變更後的資料頁內容。事務提交時,DELETE模式將日誌刷盤,將DB檔案刷盤,成功後,再將日誌檔案清理;WAL模式則是將日誌檔案刷盤,即可完成提交過程。
建議將journal_mode 設定為delete,當資料寫入資料庫有失敗動作時,透過journal檔案予以復原到未更動前(原始)資料,來確保資料完整與一致性。如果在每次寫入的時間很長或頻繁的進行資料庫寫入情況下,因系統(主機)電力不穩或突然斷電時,那麼下次重新啟動,而journal檔案若存在,則在開啟SQLite資料庫時,若發現有journal檔案的存在,便會對資料庫做Rollback 動作(還原)。
journal_size_limit
預設值為-1,表示沒有限制,單位是位元組。
DELETE模式下,當日志增長超過閥值時,則進行截斷。default_journal_size_limit,用於設定日誌檔案的預設大小。
cache_size
cache_size Pragma 可獲取或暫時設定在記憶體中頁面快取的最大尺寸。
pages 值表示在快取中的頁面數。內建頁面快取的預設大小為 2,000 頁,最小尺寸為 10 頁。每頁使用約1.5K記憶體,若需要使用改變大量多行的UPDATE或DELETE命令,並且不介意SQLite使用更多的記憶體的話,可以增大快取以提高效能。建議設定為2000即可。
auto_vacuum
auto_vacuum Pragma 獲取或設定 auto-vacuum 模式。
Pragma 值描述0 或 NONE禁用 Auto-vacuum。這是預設模式,意味著資料庫檔案尺寸大小不會縮小,除非手動使用 VACUUM 命令。1 或 FULL啟用 Auto-vacuum,是全自動的。在該模式下,允許資料庫檔案隨著資料從資料庫移除而縮小。2 或 INCREMENTAL啟用 Auto-vacuum,但是必須手動啟用。在該模式下,引用資料被維持,自由頁面只放在自由列表中。這些頁面可在任何時候使用 incremental_vacuum pragma 進行覆蓋。
正常情況下,當提交一個從資料庫中刪除資料的事務時,資料庫檔案不改變大小。未使用的檔案頁被標記並在以後的新增操作中再次使用。這種情況下使用VACUUM命令釋放刪除得到的空間。但是Vacuum的效率非常低!建議 設定成NONE(0),定時手動進行VACUUM操作。
void db_config(sqlite3 *db)
{
int ret;
char *errmsg=NULL;
system("sync");
ret = db_sql_exec(db,"pragma journal_mode=delete;",&errmsg);
if(ret !=SQLITE_OK)
fprintf(stderr, "config db wal error: %s\n", errmsg);
sqlite3_free(errmsg);
}
ret = db_sql_exec(db,"pragma synchronous=FULL;",&errmsg);
fprintf(stderr, "config db synchronous error: %s\n", errmsg);
ret = db_sql_exec(db,"pragma journal_size_limit=409600;",&errmsg);
fprintf(stderr, "config db journal_size_limit error: %s\n", errmsg);
ret = db_sql_exec(db,"PRAGMA cache_size =2000",&errmsg);
fprintf(stderr, "config db cache_size error: %s\n", errmsg);
ret = db_sql_exec(db,"PRAGMA auto_vacuum = NONE;",&errmsg);
fprintf(stderr, "config db auto_vacuum error: %s\n", errmsg);
參考:
https://blog.csdn.net/tietao/article/details/6890350
https://www.runoob.com/sqlite/sqlite-pragma.html
http://www.it165.net/database/html/201310/4691.html
https://blog.csdn.net/zhaofuguang/article/details/91882073
Sqlite 快取引數在下文中查詢:資料庫一般執行在嵌入式環境中,需要兼顧效能和硬體資源。
SQLite 使用 PRAGMA 命令在 SQLite 環境內控制各種環境變數和狀態標誌。一個 PRAGMA 值可以被讀取,也可以根據需求進行設定。主要介紹幾個在嵌入式開發中經常使用的關鍵引數。
synchronous
synchronous Pragma 獲取或設定當前磁碟的同步模式,該模式控制積極的 SQLite 如何將資料寫入物理儲存。也就是說該引數控制何時執行sync指令。
Pragma 值描述0 或 OFF不進行同步。1 或 NORMAL在關鍵的磁碟操作的每個序列後同步。2 或 FULL在每個關鍵的磁碟操作後同步。
當synchronous設定為FULL (2), SQLite資料庫引擎在緊急時刻會暫停以確定資料已經寫入磁碟。這使系統崩潰或電源出問題時能確保資料庫在重起後不會損壞。為了保證資料的安全性,該項建議設定為FULL。
journal_mode
journal_mode Pragma 獲取或設定控制日誌檔案如何儲存和處理的日誌模式。
Pragma 值描述DELETE預設模式。在該模式下,在事務結束時,日誌檔案將被刪除。TRUNCATE日誌檔案被階段為零位元組長度。PERSIST日誌檔案被留在原地,但頭部被重寫,表明日誌不再有效。MEMORY日誌記錄保留在記憶體中,而不是磁碟上。OFF不保留任何日誌記錄。
首先補充一個知識點,SQLite中日誌模式主要有DELETE和WAL兩種,其中WAL(Write ahead logging)是一種日誌模式,它是一種思想,普遍應用於關係型資料庫。每個事務執行變更時,修改資料頁,同時會產生日誌,這樣在事務提交後,不需要將修改的髒頁刷盤,只需要將事務產生的日誌落盤即可返回。WAL保證日誌一定先於對應的髒頁落盤,就是所謂的WAL。
DELETE模式採用影子分頁技術(Shadow paging),DELETE模式下,日誌中記錄的變更前資料頁內容;WAL模式下,日誌中記錄的是變更後的資料頁內容。事務提交時,DELETE模式將日誌刷盤,將DB檔案刷盤,成功後,再將日誌檔案清理;WAL模式則是將日誌檔案刷盤,即可完成提交過程。
建議將journal_mode 設定為delete,當資料寫入資料庫有失敗動作時,透過journal檔案予以復原到未更動前(原始)資料,來確保資料完整與一致性。如果在每次寫入的時間很長或頻繁的進行資料庫寫入情況下,因系統(主機)電力不穩或突然斷電時,那麼下次重新啟動,而journal檔案若存在,則在開啟SQLite資料庫時,若發現有journal檔案的存在,便會對資料庫做Rollback 動作(還原)。
journal_size_limit
預設值為-1,表示沒有限制,單位是位元組。
DELETE模式下,當日志增長超過閥值時,則進行截斷。default_journal_size_limit,用於設定日誌檔案的預設大小。
cache_size
cache_size Pragma 可獲取或暫時設定在記憶體中頁面快取的最大尺寸。
pages 值表示在快取中的頁面數。內建頁面快取的預設大小為 2,000 頁,最小尺寸為 10 頁。每頁使用約1.5K記憶體,若需要使用改變大量多行的UPDATE或DELETE命令,並且不介意SQLite使用更多的記憶體的話,可以增大快取以提高效能。建議設定為2000即可。
auto_vacuum
auto_vacuum Pragma 獲取或設定 auto-vacuum 模式。
Pragma 值描述0 或 NONE禁用 Auto-vacuum。這是預設模式,意味著資料庫檔案尺寸大小不會縮小,除非手動使用 VACUUM 命令。1 或 FULL啟用 Auto-vacuum,是全自動的。在該模式下,允許資料庫檔案隨著資料從資料庫移除而縮小。2 或 INCREMENTAL啟用 Auto-vacuum,但是必須手動啟用。在該模式下,引用資料被維持,自由頁面只放在自由列表中。這些頁面可在任何時候使用 incremental_vacuum pragma 進行覆蓋。
正常情況下,當提交一個從資料庫中刪除資料的事務時,資料庫檔案不改變大小。未使用的檔案頁被標記並在以後的新增操作中再次使用。這種情況下使用VACUUM命令釋放刪除得到的空間。但是Vacuum的效率非常低!建議 設定成NONE(0),定時手動進行VACUUM操作。
void db_config(sqlite3 *db)
{
int ret;
char *errmsg=NULL;
system("sync");
ret = db_sql_exec(db,"pragma journal_mode=delete;",&errmsg);
if(ret !=SQLITE_OK)
{
fprintf(stderr, "config db wal error: %s\n", errmsg);
sqlite3_free(errmsg);
}
ret = db_sql_exec(db,"pragma synchronous=FULL;",&errmsg);
if(ret !=SQLITE_OK)
{
fprintf(stderr, "config db synchronous error: %s\n", errmsg);
sqlite3_free(errmsg);
}
ret = db_sql_exec(db,"pragma journal_size_limit=409600;",&errmsg);
if(ret !=SQLITE_OK)
{
fprintf(stderr, "config db journal_size_limit error: %s\n", errmsg);
sqlite3_free(errmsg);
}
ret = db_sql_exec(db,"PRAGMA cache_size =2000",&errmsg);
if(ret !=SQLITE_OK)
{
fprintf(stderr, "config db cache_size error: %s\n", errmsg);
sqlite3_free(errmsg);
}
ret = db_sql_exec(db,"PRAGMA auto_vacuum = NONE;",&errmsg);
if(ret !=SQLITE_OK)
{
fprintf(stderr, "config db auto_vacuum error: %s\n", errmsg);
sqlite3_free(errmsg);
}
}
參考:
https://blog.csdn.net/tietao/article/details/6890350
https://www.runoob.com/sqlite/sqlite-pragma.html
http://www.it165.net/database/html/201310/4691.html
https://blog.csdn.net/zhaofuguang/article/details/91882073