2010-11-27 20 views
6

Intenté insertar 1000 filas en mi sqlite db, pero me llevó más de 16 segundos. ¿Hay algún error en mi código que no haya visto?16sec para insertar 1000 filas en una base de datos SQLite en el iPhone?

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!

Respuesta

1

es probable que tenga que hacer una inserción masiva en lugar de hacer viajes de 1000 a SQL

+0

hum ... intentamos obtener ejemplos de código, pero no pudimos encontrar uno que funcione ... ¿cómo lo harías? thx – vincent

+0

solo crea la cadena completa para las consultas de inserción separadas por un punto y coma en el ciclo. después de que termine el ciclo, envíe la consulta solo una vez. –

+0

Lo intenté pero solo insertó una fila. – vincent

0

No hay cifras concretas aquí, pero se trata de lo que cabe esperar. Use la inserción masiva, tal vez pruebe diferentes tamaños de paquete también.

1

¿Estás seguro de que haces los insertos en una transacción? SQLite es extremadamente lento si se confirma automáticamente en cada inserción.

+0

bueno, pensé, pero trataré de hacer una inserción masiva para ver si obtuve mejores desempeños – vincent

7

finalmente añadieron esas 2 líneas alrededor de mis consultas de inserción:

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 

gracias por su ayuda!

13

Esto se debe al autocompromiso de SQLite. Es necesario llamar con sqlite3_exec:

BEGIN TRANSACTION 

Ahora insertar todos sus registros como antes. Después de que termines con eso. Ejecutar:

COMMIT TRANSACTION 

Eso debería hacer el truco.

También this FAQ question explicará por qué es mucho más lento. De hecho, es mucho más rápido que unas pocas docenas de consultas por segundo, como se indica en las preguntas frecuentes, pero debido a la naturaleza de la memoria flash en el iPhone, parece normal.

+0

sí, eso es lo que finalmente hice y trabajé :) – 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); 
    } 

} 
Cuestiones relacionadas