Antes de marcar esta pregunta como duplicada, ¡POR FAVOR ME ESCUCHEN!
Ya he leído las preguntas que se hacen aquí sobre cómo mejorar el rendimiento, p. solo por mencionar algunos Improve INSERT-per-second performance of SQLite? y What are the performance characteristics of sqlite with very large database files?SQLite: ¿cuáles son los límites prácticos?
Tengo dificultades para hacer que sqlite funcione con un tamaño de archivo de base de datos de 5 gigabytes. Por el contrario, hay personas que afirman que sqlite funciona 'genial' para ellos, incluso cuando el tamaño de la base de datos es tan grande como 160 GB. No lo he probado yo solo, pero a partir de las preguntas formuladas, creo que todo el benchmarking tal vez se haga con solo tabla en la base de datos.
estoy usando una base de datos con
- 20 o así mesas
- La mitad de las mesas tienen más de 15 columnas
- Cada uno de estos 15-o-tan-columna-mesas tienen 6/7 clave externa columnas - Algunas de estas tablas ya han crecido hasta tener 27 millones de registros en un mes
La máquina de desarrollo que estoy usando es una máquina Quad Core de 3 GHz con 4 gigas de RAM y aún tarda más de 3 minutos solo para consultar el row_count en estas tablas grandes.
No he podido encontrar ninguna forma de dividir los datos horizontalmente. La mejor opción que tengo es dividir los datos entre múltiples archivos de base de datos, uno para cada tabla. Pero en ese caso, hasta donde yo sé, las restricciones de la columna de la clave externa no se pueden emplear, así que tendré que crear una tabla autosuficiente (sin claves externas).
Así que mis preguntas son
a) ¿Estoy utilizando la base de datos incorrecta para el trabajo?
b) ¿Qué piensas dónde me estoy equivocando?
c) Todavía no he agregado índices a las claves foráneas, pero si solo la consulta de recuento de filas tarda cuatro minutos, ¿cómo me ayudan los índices de claves externas?
EDITAR Para proporcionar más información a pesar de que nadie ha preguntado por ella :) estoy usando la versión 3.7.9 con la versión de SQLite system.data.sqlite.dll 1.0.77.0
Edit2: PIENSO donde voy a diferenciarme de los chicos de 160 gig es que pueden seleccionar un récord individual o una pequeña gama de registros. Pero tengo que cargar todas las 27 millones de filas en mi tabla, unirlas a otras tablas, agrupar los registros como lo solicite el Usuario y devolver los resultados. Cualquier entrada sobre cuál es la mejor manera de optimizar la base de datos para tales resultados.
No puedo almacenar en caché los resultados de una consulta anterior, ya que no tiene sentido en mi caso. Las posibilidades de golpear el caché serán bastante bajas.
Si otros dicen que las bases de datos de 160GB funcionan bien, claramente debe ser algo que estás haciendo, pero no nos estás diciendo * cómo * estás haciendo cosas, excepto para decir que no tienes índices en el extranjero llaves. ¿Has intentado * indexar las claves externas? –
Según las preguntas formuladas, creo que las bases de datos de 160 Gb usaban solo una tabla. No, aún no he agregado índices en claves foráneas, porque incluso cuando ejecuto una consulta donde las claves foráneas no están involucradas, es decir, 'Seleccionar conteo (*) de some_table', sqlite tarda minutos en devolver el resultado de esta consulta. Agregaré índices a claves externas y volveré. Por favor, hágame saber qué más información le gustaría saber. – WPFAbsoluteNewBie
¿Tiene índices en las tablas? –