在iPhone上优化SQLite3

时间:2009-09-08 05:03:22

标签: iphone objective-c sqlite

我有一个使用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;
}

3 个答案:

答案 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);