2010-11-27 8 views
6

私はsqlite dbに1000行を挿入しようとしましたが、16秒以上かかりました。私のコードに何か間違っていますか?16秒でiPhoneのSQLite DBに1000行挿入できますか?

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!

答えて

1

あなたはおそらく代わりに、ここで

+0

ハム..コード例を取得しようとしましたが、動作するものは見つかりませんでした。 thx – vincent

+0

は、ループ内でセミコロンで区切られた挿入クエリの文字列全体を作成するだけです。ループが終了した後、クエリを一度だけ送信します。 –

+0

私は試みましたが、それは1つの行だけを挿入しました。 – vincent

0

ませハード番号をSQLないように1000回の旅行をすることの一括挿入を行う必要があり、それは私が期待するものについてです。一括挿入を使用してください。異なるバンドルサイズを試してください。

1

あなたは本当に1回のトランザクションで挿入を行いますか? 各挿入時に自動コミットすると、SQLiteが非常に遅くなります。

+0

まあ、私は思ったが、私はより良いパフォーマンスを持っているかどうかを確認するために一括挿入をしようとします。 – vincent

7

私はようやく私のINSERTクエリの周りの人の2行を追加:あなたの助けを

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 

感謝を!

13

これは、SQLiteの自動コミットによるものです。今、以前のように、すべてのレコードを挿入

BEGIN TRANSACTION 

:あなたはとsqlite3_execを呼び出す必要があります。あなたはそれで終わった後。実行:

COMMIT TRANSACTION 

これはすべきことです。

また、this FAQ questionは、それがなぜ非常に遅いのかを説明します。実際には、FAQに記載されているように、毎秒数十回のクエリよりもはるかに高速ですが、iPhoneのフラッシュメモリの性質上、これは正常に見えます。

+0

はい、それは私が最後にやったものです。 – vincent

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 *[email protected]"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); 
    } 

} 
関連する問題