sqlite

1. 数据库查询慢原因可能是因为catch_size比较小?设置cache_size的大小测试下看是否有改进

连接缓冲区大小

缓冲区尺寸pragma控制一个连接可以在内存中使用多少个数据库页。要查看当前缓冲区大小的默认值,执行:

sqlite> PRAGMA cache_size;

cache_size

2000

要改变缓冲区大小,执行:

sqlite> PRAGMA cache_size=10000;

sqlite> PRAGMA cache_size;

cache_size

10000

 

 

2.触发器使用是否会提高数据库curd操作的效率?

 

 

3预处理查询

 

执行预处理查询

前面提到,预处理查询(Prepared Query)SQLite执行所有SQL命令的方式,包括以下三个步聚:

(1) 准备(preparation)

分词器(tokenizer) 、分析器(parser)和代码生成器(code generator)SQL语句编译成VDBE字节码,编译器会创建一个语句句柄(sqlite3_stmt),它包括字节码以及其它执行命令和遍历结果集所需的全部资源。相应的C APIsqlite3_prepare(),位于prepare.c文件中。

(2) 执行(execution)

虚拟机执行字节码,执行过程是一个步进(stepwise)的过程,每一步(step)sqlite3_step()启动,并由VDBE执行一段字节码。当第一次调用sqlite3_step()时,一般会获得一种锁,锁的种类由命令要做什么(读或写)决定。对于SELECT语句,每次调用sqlite3_step()使用语句句柄的游标移到结果集的下一行。对于结果集中的每一行,它返回SQLITE_ROW,当到达结果末尾时,返回SQLITE_DONE。对于其它SQL语句(INSERTUPDATEDELETE),第一次调用sqlite3_step()就导致VDBE执行整个命令。

(3) 定案(finalization)

VDBE关闭语句,释放资源。相应的C APIsqlite3_finalize(),它导致VDBE结束程序运行并关闭语句句柄。如果事务是由人工控制开始的,它必须由人工控制进行提交或回卷,否则sqlite3_finalize()会返回一个错误。当sqlite3_finalize()执行成功,所有与语句对象关联的资源都将被释放。在自动提交模式下,还会释放关联的数据库锁。

每一步(preparationexecutionfinalization)都关联于语句句柄的一种状态(preparedactivefinalized)Pepared表示所有资源都已分配,语句已经可以执行,但还没有执行。现在还没有申请锁,一直到调用sqlite3_step()时才会申请锁。Active状态开始于对sqlite3_step()的调用,此时语句正在被执行并拥有某种锁。Finalized意味着语句已经被关闭且所有相关资源已经被释放。通过图5-2可以更容易地理解该过程:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值