我试图在我的sqlite数据库中插入1000行,但是花了超过16秒..我的代码中有什么问题我没看到?
NSLog(@"--start--");
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
static sqlite3_stmt *compiledStatement;
for(int k = 0; k < 1000; k++)
sqlite3_exec(database, [[NSString stringWithFormat:@"insert into myTable (id, name) values ('%i', 'a')", k] UTF8String], NULL, NULL, NULL);
sqlite3_finalize(compiledStatement);
sqlite3_close(database);
}
NSLog(@"--stop--");
start : 2010-11-27 11:21:11.704
stop : 2010-11-27 11:21:27.908
thx!
答案 0 :(得分:13)
这是由于SQLite的自动提交。您需要通过以下方式致电sqlite3_exec
BEGIN TRANSACTION
现在像以前一样插入所有记录。完成后。执行:
COMMIT TRANSACTION
这应该可以解决问题。
同样this FAQ question将解释为什么它会慢得多。它实际上比FAQ中所述的每秒几十个查询要快得多,但由于iPhone上闪存的性质,这似乎是正常的。
答案 1 :(得分:7)
我最后在插入查询中添加了这两行:
sqlite3_exec(database, "BEGIN", 0, 0, 0);
sqlite3_exec(database, "COMMIT", 0, 0, 0);
start : 2010-11-27 13:07:26.022
stop : 2010-11-27 13:07:26.285
感谢您的帮助!
答案 2 :(得分:1)
你可能需要进行批量插入而不是1000次访问sql
答案 3 :(得分:1)
您确定在一次交易中进行了插入吗? 如果你自动提交每个插入,SQLite非常慢。
答案 4 :(得分:1)
-(void)doBatchExecution
{
const char *dbpath = [[DatabaseManager getDataBasePath] UTF8String];
if (sqlite3_open(dbpath, &db) == SQLITE_OK)
{
char* errorMessage;
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);
NSString *query=@"YOUR_SQL_QUERY";
if (sqlite3_exec(db, [query UTF8String], NULL, NULL, &errorMessage) != SQLITE_OK)
NSLog(@"DB Error. category transacation '%s'", sqlite3_errmsg(db));
sqlite3_exec(db, "COMMIT TRANSACTION", NULL, NULL, &errorMessage);
}
}
答案 5 :(得分:0)
这里没有硬数字,但它是关于我期望的。使用批量插入,也可以尝试不同的包大小。