2010-06-17 27 views
6

Tengo una base de datos llena de información para películas, que (a su vez) se lee en la base de datos desde un archivo XML en un servidor web.Optimización de llamadas a bases de datos

lo que sucede es lo siguiente:

Gather/Parse XML and store film info as objects 
Begin Statement 
For every film object we found: 
    Check to see if record for film exists in database 
    If no film record, write data for film 
Commit Statement 

Actualmente acabo de comprobar la existencia de una película usando (lo más básico):

SELECT film_title FROM film WHERE film_id = ? 

Si que devuelve una fila, entonces la película existe, si no, tengo que añadir que ...

también he intentado usar

INSERT INTO film (film_id, film_title, film_mStar, film_dStar, film_date) SELECT ?, ?, ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM film WHERE film_id = ?) 

Para el mismo efecto en términos de tiempo de procesamiento ...

El único problema es, es que hay muchos cientos de registros en la base de datos (un montón de películas!) Y porque se tiene que comprobar para la existencia de una película en la base de datos antes de que pueda escribirla, todo el proceso termina tomando bastante tiempo (aproximadamente 27 segundos para 210 películas)

¿Existe algún método más eficiente para hacer esto o solo sugerencias? ¿en general?

lenguaje de programación es Objective-C, la base de datos está en sqlite3, la plataforma es iPhone/iPad/iPod Touch

Gracias, Dwaine

+0

+1 Buena pregunta. ¿Cómo se dice que la película ya existe en la base de datos?Añádelo a tu publicación por favor. – DJTripleThreat

+0

¿Hay algo más que creas que debería agregar a la publicación? –

+0

¿Qué plataforma? Objective-C + sqlite me hace pensar en iPhone/iPad. – Seth

Respuesta

0

Usted podría intentar agregar un índice en film_id para acelerar la búsqueda de la existente películas.

Algo como esto debe hacer el trabajo:

CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id) 

Si su clave única es en realidad otra cosa (no sólo film_id, pero tal título y año), entonces usted debe incluir todas las columnas que se utilizan en su índice.

0

Si film_id es único por película, usted podría considerar algo como:

SELECT film_id FROM film; 

en el arranque y el caché de todos los identificadores en una matriz o similar. Luego, cuando lea un nuevo registro de su XML, verifique la existencia del film_id en la matriz y si no está allí, agréguelo a la matriz y a la base de datos. De esta forma, solo SELECCIONA una vez por archivo en lugar de una vez por película.

Editar: Otra cosa a considerar serían las transacciones. En el inicio:

BEGIN TRANSACTION; 

y después de todas sus inserciones:

COMMIT; 
0

Crear un array de booleanos para filmIDs (que sólo puede ser un mapa de bits) A continuación, establecer los bits de verdadero/falso para cada dirección correspondiente en la matriz. Luego, en lugar de usar sql para verificar si existe, compruébalo con la matriz. Al insertar, agregue el filmid = verdadero a la matriz.

Cuestiones relacionadas