我在IPhone应用程序中使用sqlite作为只读数据库。一个用例涉及发出许多select语句,每个语句返回大约3行。不可能减少查询的数量,因为下一个查询的参数取决于前一个查询的结果。查询本身非常简单:
SELECT int1, int2, int3, int4 , int5, int6, int7 FROM sometable WHERE (int1 = ? AND int2 = ?) or (int3 = ? and int4 = ?) ORDER BY ROWID该表有一个索引(int1,int2)和一个索引(int3,int4)。所有int都有整型数据类型
查询是通过C-API完成的。使用sqlite3_prepare_v2()编译语句,并将其用于所有查询。在每次查询之后,在绑定新参数之前对语句执行sqlite3_reset()。
使用标志SQLITE_OPEN_READONLY和SQLITE_OPEN_NOMUTEX打开数据库文件。
在xAccess上的分析显示,大部分时间都花在了sqlite3VdbeExec->sqlite3BtreeBeginTrans->sqlite3PagerSharedLock->line pVfs -> IPhone () sqlite3_step()上。
我不是sqlite专家,但对我来说,似乎有时间浪费在不必要的锁定上。这是不必要的,因为它可以保证在此查询完成时不会对数据库进行其他访问。我也想知道sqlite3BtreeBeginTrans。是否为select语句创建事务?
谁能告诉我如何进一步优化这一点?
发布于 2012-03-19 23:03:09
来自sqlite-user mailing list的正确答案是使用独占锁定模式:
将锁定模式设置为独占有三个原因:... 2)减少了文件系统操作的系统调用次数,这可能会导致较小的性能提升。
加速40%左右...
https://stackoverflow.com/questions/9760919
复制相似问题