Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Базы данных и репортинг > добавление в таблицу БД |
Автор: NieL 15.3.2011, 23:39 | ||
Есть 2 таблицы БД Categories (ID, Name) Products (ID, Name, category_id) Есть список, каждая запись которого является Categories.ID: 11 36 17 57 21 88 .. Задача: пройти по списку, проверя существование каждой записи в таблице Gategories, если существует добавить в таблицу Products новую запись назначив полю categories_id значение из списка. В списке около 15 000 записей, как сделать проверку и добавление максимально быстрым. Вот мой код, но выполняется все долго.
Еще пытался делать через запросы (проверка (SELECT) и добавление (INSERT)) так вообще, в секунду по 2-3 записи добавляется. |
Автор: Vas 16.3.2011, 16:13 |
БД какая? |
Автор: NieL 16.3.2011, 18:25 |
субд DBISAM объясню все подробно: Написал com-сервер для взаммодействия с базой данных приложения из 1C. В нем реализован метод add_product, который добавляет запись (товар) в таблицу базы данных, делает эту запись текущей и дальше с помощью других функций com-сервера человек может назначать значения полей для этой записи и так далее. Метод расчитан на добавление одной записи. Изначально алгоритм метода сводился к простому insert-запросу. Проблема в следующем: человек, который его использует из 1С в цикле добавляет 10000 записей, таким образом по сути выполнится 10000 запросов, у меня это занимает больше часа, если же делать через Table.Append, Table.Post время выполнения сокращается до 40-50 минут. В обоих случаях очень долго. Как оптимизировать затраты? |
Автор: cat512 16.3.2011, 18:43 |
Необходимо определить где узкое место. Может проблема в медленной работе методов com-сервера. Проверить это просто. Берёшь профайлер "оборачивешь" методы com-сервера. Смотришь время. Берёшь "смотрелку" для бд. Выполняеш в ней тот же запрос (или пакетную вставку). Смотришь время. Таким образом определяешь "узкое место", а после работаешь над оптимизацией, либо com-сервера (переделываешь на пакетную вставку), либо бд (смотришь какой уровень изоляции транзакций используется. по каким полям созданы индексы и т.д.) |
Автор: interinna 13.11.2011, 11:42 | ||
Спасибо за совет |
Автор: Данкинг 13.11.2011, 11:57 |
interinna, у тебя проблемы с той же СУБД? |