Tengo una base de datos Sqlite3 con una tabla y una clave principal que consta de dos enteros, y estoy tratando de insertar muchos datos en ella (es decir, alrededor de 1 GB)Sqlite3: ¿Desactivar el índice de clave principal durante la inserción?
El problema que tengo es que la creación de la clave principal también implícitamente crea un índice, que en mi caso se infiltra en un rastreo después de algunas confirmaciones (y eso sería porque el archivo de la base de datos está en NFS ... suspiro).
Por lo tanto, me gustaría de alguna manera desactivar temporalmente ese índice. Hasta ahora, mi mejor plan consistía en eliminar el índice automático de la clave principal, pero parece que a SQLite no le gusta y arroja un error si intento hacerlo.
Mi segundo mejor plan consistiría en que la aplicación realizara copias transparentes de la base de datos en la unidad de red, realizando modificaciones y luego fusionándola. Tenga en cuenta que a diferencia de la mayoría de las preguntas SQlite/NFS, no necesito concurrencia de acceso.
¿Cuál sería la forma correcta de hacer algo como eso?
ACTUALIZACIÓN:
me olvidó especificar las banderas ya estoy usando:
PRAGMA synchronous = OFF
PRAGMA journal_mode = OFF
PRAGMA locking_mode = EXCLUSIVE
PRAGMA temp_store = MEMORY
ACTUALIZACIÓN 2: estoy, de hecho, la inserción de artículos en lotes, sin embargo cada lado el lote es más lento de comprometer que el anterior (supongo que esto tiene que ver con el tamaño del índice). Intenté hacer lotes de entre 10k y 50k tuplas, cada uno de los cuales constaba de dos enteros y un flotador.
Mantener la cantidad de datos por uno INSERTAR declaración en línea con el parámetro cache_size parece hacer el truco. Obviamente, hay más memoria caché, se pueden insertar más elementos de una vez. También parece que puedo hacer una confirmación al final de todo después de todo. –
Bueno, puedes. Pero el truco principal para cualquier operación de inserción es O (1) es completar los datos ordenados por ese índice, pero en el caso de que sus datos se ajusten a la memoria caché, todo es realmente rápido. Es razonable mantener el tamaño de compromiso menor que el tamaño de caché, de lo contrario, sqlite se verá obligado a moverlo al disco. – Mash