16 секунд, чтобы вставить 1000 строк в БД SQLite на iPhone? - PullRequest
6 голосов
/ 27 ноября 2010

Я попытался вставить 1000 строк в базу данных sqlite, но это заняло более 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!

Ответы [ 6 ]

13 голосов
/ 27 ноября 2010

Это связано с автоматической фиксацией SQLite. Вам нужно позвонить sqlite3_exec с:

BEGIN TRANSACTION

Теперь вставьте все свои записи, как и раньше. После того, как вы закончите с этим. Выполнение:

COMMIT TRANSACTION

Это должно сработать.

Также этот вопрос FAQ объяснит, почему он намного медленнее. На самом деле это намного быстрее, чем несколько десятков запросов в секунду, как указано в FAQ, но из-за особенностей флэш-памяти на iPhone это выглядит нормально.

7 голосов
/ 27 ноября 2010

Я наконец добавил эти 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

спасибо за вашу помощь!

1 голос
/ 05 июля 2013
-(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);
   }

 }
1 голос
/ 27 ноября 2010

Вы уверены, что делаете вставки в одной транзакции? SQLite работает очень медленно, если вы автоматически фиксируете каждую вставку.

1 голос
/ 27 ноября 2010

вам, вероятно, нужно выполнить массовую вставку вместо 1000 обращений к sql

0 голосов
/ 27 ноября 2010

Здесь нет жёстких цифр, но это примерно то, что я ожидал.Используйте массовую вставку, возможно, попробуйте разные размеры пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...