Sqlite 性能参数

        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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值