2010-06-17 14 views
6

J'ai une base de données remplie d'informations pour les films, qui sont (à leur tour) lues dans la base de données à partir d'un fichier XML sur un serveur Web.Optimisation des appels de base de données

Qu'est-ce qui se passe est la suivante:

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 

Actuellement, je juste tester l'existence d'un film en utilisant (le très basique):

SELECT film_title FROM film WHERE film_id = ? 

Si cela retourne une ligne, puis le film existe, sinon je dois l'ajouter ...

J'ai également essayé d'utiliser

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

Pour exactement le même effet en termes de temps de traitement ...

Le seul problème est, est qu'il ya beaucoup de centaines d'enregistrements dans la base de données (beaucoup de films!) Et parce qu'il doit vérifier pour l'existence d'un film dans la base de données avant de pouvoir l'écrire, l'ensemble du processus prend un certain temps (environ 27 secondes pour 210 films)

Y at-il une méthode plus efficace pour ce faire, ou juste des suggestions en général?

langage de programmation est Objective-C, base de données est en sqlite3, plate-forme est l'iPhone/iPad/iPod Touch

Merci, Dwaine

+0

+1 Bonne question. Comment dites-vous que le film existe déjà dans la base de données?Ajoutez cela à votre message s'il vous plaît. – DJTripleThreat

+0

Y at-il autre chose que vous pensez que je devrais ajouter à la publication? –

+0

Quelle plateforme? Objective-C + sqlite me fait penser à iPhone/iPad. – Seth

Répondre

0

Vous pouvez essayer d'ajouter un index sur film_id pour accélérer la recherche existante films.

Quelque chose comme cela devrait faire le travail:

CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id) 

Si votre clé unique est en fait quelque chose d'autre (pas seulement film_id, mais peut-être le titre et l'année), alors vous devriez inclure toutes les colonnes que vous utilisez dans votre indice.

0

Si film_id est unique par film, vous pourriez envisager quelque chose comme:

SELECT film_id FROM film; 

au démarrage, et le cache toutes les ids dans un tableau ou similaire. Ensuite, lorsque vous lisez un nouvel enregistrement à partir de votre XML, vérifiez l'existence du film_id dans le tableau et si ce n'est pas le cas, ajoutez-le à la matrice et à la base de données. De cette façon, vous ne sélectionnez qu'une seule fois par fichier plutôt qu'une fois par film.

Modifier: Une autre chose à considérer serait les transactions. Au démarrage:

BEGIN TRANSACTION; 

et après toutes vos insertions:

COMMIT; 
0

Créer un tableau de booléens pour filmIDs (il peut juste être un peu-carte) Définissez ensuite les bits à faux/vrai pour chaque adresse correspondante dans le tableau. Ensuite, au lieu d'utiliser sql pour vérifier s'il existe, vérifiez-le par rapport au tableau. Lors de l'insertion, ajoutez filmid = true au tableau.

Questions connexes