programacion - sqlite: forma más rápida de obtener todas las filas(acceso de disco consecutivo)
manual de programacion android pdf (3)
Quiero leer todas las filas en una tabla usando system.data.sqlite. Como tengo una tabla muy grande (> 450 GB, con> 6 mil millones de filas), quiero estar seguro de que sqlite utilizará el acceso consecutivo al disco. Como sabrá, un acceso aleatorio al disco duro es lento. Debido a las restricciones de la memoria, no puedo cargar todos los datos a la vez. Entonces, la forma óptima sería si sqlite lee unos cien MB (consecutivos), luego trabajo con estos datos y sqlite lee el siguiente.
¿Cómo puedo estar seguro de que sqlite accederá al disco de esta manera y no saltará de una posición en el disco duro a otra?
Cosas que sé (creo que estas sugerencias aparecerán):
- Podría ser mejor usar otro DBMS. Pero quiero / necesito resolverlo con este.
- Sé que el sistema operativo colocará la cabeza del disco en otros datos mientras estoy trabajando con los datos. Esto no importa Es solo que algunos cientos de MB se leerán consecutivamente.
- No quiero / puedo dividir el archivo de la base de datos en pedazos más pequeños
Encontré esta publicación, pero no está abordando mi problema correctamente:
¿Cuál es la forma más rápida de recuperar todos los elementos en SQLite?
Para eso está el índice agrupado. sqlite no los admite.
Lo siguiente se copia de: http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuningWindows
Cuatro: Índices agrupados
SQLite no admite índices agrupados (simplemente, índices que fuerzan a los datos de la base de datos a establecerse físicamente en el MISMO orden en que el índice lo necesita).
Esto significa que si su índice es INTEGER secuencial, los registros se establecen físicamente en la base de datos en ese orden INTEGERs, 1 luego 2 y luego 3.
No puede hacer un índice agrupado, pero PUEDE ordenar sus datos en orden para que los datos históricos estén bien ordenados. Por supuesto, a medida que la base de datos madura, pierdes eso, pero ayuda
Alguien más publicó esto, y es un buen ejemplo para usar, así que lo haré. Si tiene una tabla WIBBLE a cuyo campo KEY desea acceder mucho, sería bueno que todo estuviera en orden. Con la herramienta de línea de comandos, puede crear un clúster falso haciendo lo siguiente:
create table wibble2 as select * from wibble; delete from wibble; insert into wibble select * from wibble2 order by key; drop table wibble2;
En resumen, puede reordenar sus registros manualmente, pero imagino que esto sería práctico para usted solo si no tiene la intención de escribir en la mesa con frecuencia.
En SQLite, las filas de la tabla se almacenan ordenadas por el rowid , por lo que la forma más eficiente de leer las filas en este orden es ordenar por esta columna (o el alias declarado con INTEGER PRIMARY KEY):
SELECT * FROM wibble ORDER BY rowid
Para una tabla WITHOUT ROWID , ordena por columna (s) de clave principal:
SELECT * FROM wibble ORDER BY MyPrimary, KeyColumns
Desde @CL. respuesta en esta publicación :
En SQLite, los índices creados con CREATE INDEX son índices no agrupados.
Desde la versión 3.8.2, SQLite admite tablas SIN ROWID, que son índices agrupados.