2010-06-17 20 views
6

Mam bazę danych wypełnioną informacjami o filmach, która jest (z kolei) odczytywana do bazy danych z pliku XML na serwerze internetowym.Optymalizowanie połączeń z bazami danych

Co się dzieje, jest następujący:

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 

Obecnie po prostu przetestować na istnienie folię za pomocą (bardzo podstawowy):

SELECT film_title FROM film WHERE film_id = ? 

Jeśli zwraca wiersz, a następnie film istnieje, jeśli nie to muszę go dodać ...

próbowałem również używając

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

Aby dokładnie taki sam efekt w odniesieniu do czasu przetwarzania ...

Jedynym problemem jest to, że istnieje wiele wiele setek zapisów w bazie danych (wiele filmów!) I dlatego, że musi sprawdzić na istnienie filmu w bazie danych, zanim będzie można go napisać, cały proces kończy się dość długo (około 27 sekund na 210 filmów).

Czy istnieje skuteczniejsza metoda wykonania tego, lub tylko sugestie ogólnie?

Język programowania jest Objective-C, baza danych jest w sqlite3, platforma jest iPhone/iPad/ipod touch

Dzięki Dwaine

+0

+1 Dobre pytanie. Jak możesz powiedzieć, że film już istnieje w bazie danych?Dodaj to do swojego postu. – DJTripleThreat

+0

Czy jest coś jeszcze, co Twoim zdaniem powinienem dodać do postu? –

+0

Jaka platforma? Objective-C + sqlite sprawia, że ​​myślę, że iPhone/iPad. – Seth

Odpowiedz

0

Można spróbować dodanie indeksu na film_id przyspieszyć poszukiwania istniejących filmy.

Coś jak to powinno załatwić sprawę:

CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id) 

Jeśli unikalny klucz jest faktycznie coś innego (nie tylko film_id, ale może tytuł i rok), wówczas należy uwzględnić wszystkie kolumny, które wykorzystania w indeks.

0

Jeśli film_id jest unikalny na film, można rozważyć coś takiego:

SELECT film_id FROM film; 

przy starcie i buforują wszystkie identyfikatory w tablicy lub podobne. Następnie, gdy czytasz nowy rekord z pliku XML, sprawdź, czy istnieje identyfikator film_id w tablicy, a jeśli go nie ma, dodaj go do tablicy i bazy danych. W ten sposób WYBIERASZ tylko raz na plik, a nie raz na film.

Edycja: Kolejną rzeczą do rozważenia byłyby transakcje. Przy uruchamianiu:

BEGIN TRANSACTION; 

i po wszystkie wstawki:

COMMIT; 
0

Utwórz tablicę wartości logiczne dla filmIDs (może to być po prostu nieco-MAP) następnie ustawić bity false/true dla każdy odpowiadający adres w tablicy. Zamiast tego, aby użyć sql do sprawdzenia, czy istnieje, sprawdź to w stosunku do tablicy. Po wstawieniu dodaj filmid = true do tablicy.

Powiązane problemy