У меня есть база данных, которая заполнена информацией для фильмов, которая (в свою очередь) читается в в базу данных от XML-файла на веб-сервере.
То, что происходит, следующее:
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
В настоящее время я просто тестирую на существование использования фильма (очень простое):
SELECT film_title FROM film WHERE film_id = ?
Если это возвращает строку, то фильм существует, если не затем я должен добавить его...
Я также попытался использовать
INSERT INTO film (film_id, film_title, film_mStar, film_dStar, film_date) SELECT ?, ?, ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM film WHERE film_id = ?)
К тому же самому эффекту с точки зрения времени обработки...
Единственная проблема, то, что существуют многие много сотен записей в базе данных (много фильмов!) и потому что это должно проверить на существование фильма в базе данных, прежде чем это сможет записать это, целый процесс заканчивает тем, что брал долгое время (приблизительно 27 секунд для 210 фильмов)
Существует ли более эффективный способ выполнения этого или просто каких-либо предложений в целом?
Язык программирования является Objective C, база данных находится в sqlite3, платформа является iPhone/iPad/iPodTouch
Спасибо, Dwaine
Вы можете попробовать добавить индекс для film_id, чтобы ускорить поиск существующих фильмов.
Что-то вроде этого должно сработать:
CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id)
Если ваш уникальный ключ на самом деле является чем-то другим (не только film_id, но, возможно, title и годом), вы должны включить все столбцы, которые вы используете в свой индекс.
Создать массив логических значений для идентификаторов пленки (это может быть просто битовая карта) Затем установите биты в false / true для каждого соответствующего адреса в массиве. Затем вместо использования sql для проверки, существует ли он, проверьте его по массиву. При вставке добавьте в массив filmid = true.
Если film_id уникален для каждого фильма, вы могли бы подумать о чем-то вроде:
SELECT film_id FROM film;
при запуске и кэшировать все id в массив или что-то подобное. Затем, когда вы читаете новую запись из вашего XML, проверьте существование film_id в массиве, и если его там нет, добавьте его и в массив, и в базу данных. Таким образом, вы делаете SELECT только один раз на файл, а не один раз на фильм.
Редактирование: Еще одна вещь, которую следует рассмотреть, - это транзакции. При запуске:
BEGIN TRANSACTION;
и после всех вставок:
COMMIT;