2011-05-20 16 views
5

Estimado compañero desarrollador, por alguna razón, las actualizaciones de 1720 registros demoran alrededor de 15 segundos cuando se encuentra en disco SSD (especialmente cuando se tiene habilitado el ajuste).actualizaciones sqlite lento (15 segundos para 1720 registros) en disco SSD

He ajustado la configuración de SQLite utilizando el siguiente documento (que funciona bien) http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

Tengo conjunto de la siguiente PRAGMA para optimizar el rendimiento y hago uso de transacciones en todo el conjunto completo de cambios.

sqlite3_exec(database, "PRAGMA cache_size=500000;", nil, nil, nil); 
sqlite3_exec(database, "PRAGMA synchronous=OFF", nil, nil, nil); 
sqlite3_exec(database, "PRAGMA count_changes=OFF", nil, nil, nil); 
sqlite3_exec(database, "PRAGMA temp_store=MEMORY", nil, nil, nil); 

parece que el SSD está haciendo demasiado (como bloques de eliminación y tal) que hace que sea bloquear durante 15 segundos por sólo 1,720 actualización de registros simples.

Bastante extraño: la inserción de 2500 registros es casi instantánea. ¿Me pueden ayudar y darme algunos consejos sobre cómo solucionar esto?

Respuesta

5

Encontré la respuesta haciendo algunas pruebas buenas y probando. Parece que sqlite se congelará en SSD con TRIM al hacer una gran cantidad de sentencias UPDATE individuales una tras otra en una transacción.

He cambiado el código ahora: a) prepare un comando y vuelva a utilizar ese comando para todos los registros actualizados. b) COMPROMETER y COMENZAR una nueva transacción cada 1500 registros

esto parece haber arreglado la congelación en sqlite. En resumen: reutilice el enunciado sql preparado y asegúrese de que la transacción no sea demasiado grande.

Cuestiones relacionadas