Оптимизация вызовов базы данных

У меня есть база данных, которая заполнена информацией для фильмов, которая (в свою очередь) читается в в базу данных от 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

6
задан Dwaine Bailey 17 June 2010 в 03:33
поделиться

3 ответа

Вы можете попробовать добавить индекс для film_id, чтобы ускорить поиск существующих фильмов.

Что-то вроде этого должно сработать:

CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id)

Если ваш уникальный ключ на самом деле является чем-то другим (не только film_id, но, возможно, title и годом), вы должны включить все столбцы, которые вы используете в свой индекс.

0
ответ дан 18 December 2019 в 04:47
поделиться

Создать массив логических значений для идентификаторов пленки (это может быть просто битовая карта) Затем установите биты в false / true для каждого соответствующего адреса в массиве. Затем вместо использования sql для проверки, существует ли он, проверьте его по массиву. При вставке добавьте в массив filmid = true.

0
ответ дан 18 December 2019 в 04:47
поделиться

Если film_id уникален для каждого фильма, вы могли бы подумать о чем-то вроде:

SELECT film_id FROM film;

при запуске и кэшировать все id в массив или что-то подобное. Затем, когда вы читаете новую запись из вашего XML, проверьте существование film_id в массиве, и если его там нет, добавьте его и в массив, и в базу данных. Таким образом, вы делаете SELECT только один раз на файл, а не один раз на фильм.

Редактирование: Еще одна вещь, которую следует рассмотреть, - это транзакции. При запуске:

BEGIN TRANSACTION;

и после всех вставок:

COMMIT;
0
ответ дан 18 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: