Оптимизация вызовов базы данных - PullRequest
6 голосов
/ 17 июня 2010

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

Спасибо, Дуэйн

Ответы [ 3 ]

0 голосов
/ 17 июня 2010

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

SELECT film_id FROM film;

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

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

BEGIN TRANSACTION;

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

COMMIT;
0 голосов
/ 17 июня 2010

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

0 голосов
/ 17 июня 2010

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

Примерно так должно работать:

CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...