2010-04-20 11 views
6

Ahora tenemos una base de datos firebird con 1.000.000 que debe procesarse después de que TODOS estén cargados en la memoria RAM. Para obtener todos estos, debemos extraer los datos usando (seleccione * primero 1000 ...) durante 8 horas. ¿Cuál es la solución para esto?¿Cómo cargar rápidamente 1 milion de registros desde la base de datos?

+0

¿cuál es el tamaño de la tabla? ¿estás seguro de que tu memoria puede contener eso? – zsong

+2

Suena como un trabajo para ... [La base de datos más rápida del mundo] (http://thedailywtf.com/Articles/Announcing-APDB-The-Worlds-Fastest-Database.aspx)! –

+0

Se deben cargar un millón de registros en segundos a menos que estos sean realmente registros enormes. ¿Cómo los estás cargando? ¿Qué plataforma estás usando? –

Respuesta

0

¿Qué tipo de procesamiento necesita hacer para cargarlos en la memoria y no simplemente procesarlos a través de sentencias SQL?

Hay dos técnicas que uso que funcionan dependiendo de lo que estoy tratando de hacer.

  1. Suponiendo que hay algún tipo de clave artificial (identidad), el trabajo en lotes, incrementando el último valor de identidad procesado.

  2. BCP los datos a un archivo de texto, agite las actualizaciones, luego vuelva a BCP, recordando desactivar las restricciones y los índices antes del paso EN.

+0

Hacemos algunos análisis de cada uno desde db, y tenemos que tenerlos cargados en la memoria. El cuello de botella es el momento en que transferimos los datos del conjunto de registros a nuestros objetos DTO. –

0

Tome un vistazo a esto: http://www.firebirdfaq.org/faq13/

+0

Nada que me ayude en ese enlace, tal vez este problema se encuentre en todas las bases de datos. Necesito optimizar el tiempo para "while (read.Read())". –

4

¿Tiene cada uno de su "SELECT * primeros 1000" (como lo describiste) no escanear una mesa llena? Mire esas consultas y asegúrese de que estén usando un índice.

+0

No es la velocidad de selección el problema. La transferencia de datos del conjunto de registros de selección a la memoria, el tiempo (read.Read()) lleva a long ... –

1

para cargar datos de una tabla con 1.000.000 filas en C# usando una base de datos Firebird lleva en un 3 GHz Pentium 4 al menos 8 horas

todo el mundo ha estado asumiendo que se estaba ejecutando una consulta SQL para seleccionar los registros de la base de datos Algo como

select * 
from your_big_table 
/

Debido a que realmente tomaría unos segundos. Bueno, un poco más para mostrarlo en una pantalla, pero ejecutar la selección real debería ser muy rápido.

Pero esa referencia a C# me hace pensar que estás haciendo otra cosa. Quizás lo que realmente tienes es un bucle RBAR que ejemplifica un millón de objetos. Puedo ver cómo eso podría demorar un poco más. Pero aun así, ¿ocho horas? ¿A dónde va el tiempo?

edición

Mi suposición era correcta y que está instanciando 1000000 objetos en un bucle. El consejo correcto sería encontrar otra forma de hacer lo que sea que hagas una vez que tengas todos tus objetos en la memoria. Sin saber más sobre los detalles, es difícil dar detalles. Pero parece poco probable que esto sea una IU. ¿Qué usuario va a examinar un millón de objetos?

Por lo tanto, una observación general deberá bastar: utilizar operaciones masivas para implementar la actividad masiva. Las bases de datos SQL se destacan en el manejo de conjuntos. Aproveche la potencia de SQL para procesar sus millones de filas en un solo conjunto, en lugar de filas individuales.

Si no encuentra esta respuesta útil, entonces necesita darnos más detalles respecto a lo que quiere lograr.

+0

Nuestro proceso se ejecuta una vez al mes como máximo en el peor de los casos. Y sí, cargamos todos los datos de la tabla en un gran bucle. Ese lazo es nuestro cuello de botella. Por un momento, estaba pensando en hacer algunos clones del DB y ahora ejecutar algunas consultas paralelas para cargar datos más rápido. –

+2

DEBERÁ nunca cargar registros en un bucle cuando tenga tantos. Esa es la base de datos 101. Me Don; no sé pájaro de fuego, pero la mayoría de soporte de base de datos con el selector en la inserción como tabla2 inserción (campo1, campo2) seleccione campo1, campo2 de tabla1 Eso sería mucho más rápido que una fila a la vez – HLGEM

1

¿Cuánto tiempo lleva construir el objeto DTO que está creando con cada lectura de datos?

{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); } 

Estás creando un millón de estos objetos. Si lleva 29 milisegundos crear un objeto DTO, tardará más de 8 horas en completarse.

Cuestiones relacionadas