我有一个使用SQLite3的应用程序。它运行得很好,但我想加快SQLite(写)访问的建议。大多数数据库操作都是写三元组(int,int,double),每秒大约20-50三倍。偶尔会有读数,但与母鸡一样罕见(主要发生在装载时)。
有没有人有关于优化(或者至少是去消极化)代码的建议?我错过了任何SQLite3快捷方式? (由于程序中的其他内容,使用CoreData是正确的。)
我在初始化期间准备语句st1。它是由
准备的const char *sql = "insert into historic values (?, ?, ?)";
if (sqlite3_prepare_v2(database, sql, -1, &st1, NULL) == SQLITE_OK) ....
这个准备是一次性的。我用于保存的代码段如下(为清晰起见,我已删除了错误检查)。
-(BOOL) saveHvalue:(int) fid time:(int) t value:(double) v type:(int) ftype
{
{
sqlite3_bind_int(st1, 1, fid);
sqlite3_bind_int(st1, 2, t);
sqlite3_bind_int(st1, 3, ftype);
sqlite3_step(st1);
sqlite3_reset(st1);
sqlite3_clear_bindings(st1);
}
return YES;
}
答案 0 :(得分:8)
您是否正在对交易中的写入进行批处理?仅此一项就可以为您节省大量时间;你不能在一次交易中批量处理它们,或者期刊将是巨大的,但每500-1000次插入一次交易将极大地加速你的代码。
答案 1 :(得分:0)
historic
中的任何列都有索引吗?如果他们这样做,通常会更快地删除索引,插入你的东西,然后重新添加索引(如果你一次添加一个LOT)。
答案 2 :(得分:0)
我通常从不回复线程,但这对我来说很有意义(经过几天试图在其他方面进行优化)!
基本上我用for:
包装了我的for循环插件sqlite3_exec(db, "BEGIN", 0, 0, 0);
for () {
-- inserts --
}
sqlite3_exec(db, "COMMIT", 0, 0, 0);