цикл через кучу изменений БД в проекте Rails - PullRequest
1 голос
/ 08 февраля 2010

У меня есть функция импорта, которая берет кучу данных в формате xml и вставляет их в мою базу данных. Проблема в том, что в зависимости от объема данных этот процесс может занять довольно много времени. Я вижу в журнале сервера, что выполняется невероятное количество SQL-операторов, которые сохраняют все данные.

Как я могу улучшить производительность в этом случае? Можно ли выполнять все операции только в памяти и сохранять их обратно только одним оператором?

Обновление:

В ответ на ответ HLGEM:

Я прочитал способ массовой вставки, но мне он кажется не очень практичным, потому что у меня много связей между данными ... чтобы поместить 100 данных в таблицу, я должен установить отношения те к другим столам ...

Есть ли способ решить это? можно сделать инкапсулированные вставки?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2010

Ну, это зависит:)

  • Если обработка (до импорта) данных XML стоит дорого, вы можете запустить обработку один раз, импортировать в БД, а затем экспортировать простой SQL из базы данных. Тогда будущие импортеры могут использовать этот SQL для массового импорта, избегая необходимости обработки XML.

  • Если сам импорт данных стоит дорого, то вы, вероятно, захотите получить конкретную информацию для своей базы данных, чтобы выяснить, как ускорить ее. Если вы используете MySQL, вы можете проверить: https://serverfault.com/questions/37769/fast-bulk-import-of-a-large-dataset-into-mysql

0 голосов
/ 08 февраля 2010

Когда делаешь что-то с базой данных, НИКОГДА не работай построчно, именно это и вызывает твою проблему. Массовая вставка некоторого типа будет намного быстрее, чем процесс строка за строкой. Не зная базы данных, которую вы используете, трудно быть более точным в отношении того, как именно это сделать. Вы никогда не должны думать о построчной обработке, а о том, как повлиять на набор данных.

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