![]() |
|
![]() ![]() ![]() |
|
NieL |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 214 Регистрация: 10.2.2008 Репутация: нет Всего: 1 |
Есть 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 записи добавляется. Это сообщение отредактировал(а) NieL - 16.3.2011, 00:48 |
|||
|
||||
Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
БД какая?
-------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
NieL |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 214 Регистрация: 10.2.2008 Репутация: нет Всего: 1 |
субд DBISAM
объясню все подробно: Написал com-сервер для взаммодействия с базой данных приложения из 1C. В нем реализован метод add_product, который добавляет запись (товар) в таблицу базы данных, делает эту запись текущей и дальше с помощью других функций com-сервера человек может назначать значения полей для этой записи и так далее. Метод расчитан на добавление одной записи. Изначально алгоритм метода сводился к простому insert-запросу. Проблема в следующем: человек, который его использует из 1С в цикле добавляет 10000 записей, таким образом по сути выполнится 10000 запросов, у меня это занимает больше часа, если же делать через Table.Append, Table.Post время выполнения сокращается до 40-50 минут. В обоих случаях очень долго. Как оптимизировать затраты? |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Необходимо определить где узкое место. Может проблема в медленной работе методов com-сервера. Проверить это просто. Берёшь профайлер "оборачивешь" методы com-сервера. Смотришь время. Берёшь "смотрелку" для бд. Выполняеш в ней тот же запрос (или пакетную вставку). Смотришь время. Таким образом определяешь "узкое место", а после работаешь над оптимизацией,
либо com-сервера (переделываешь на пакетную вставку), либо бд (смотришь какой уровень изоляции транзакций используется. по каким полям созданы индексы и т.д.) |
|||
|
||||
interinna |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 13.11.2011 Где: Москва Репутация: нет Всего: нет |
Спасибо за совет |
|||
|
||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
interinna, у тебя проблемы с той же СУБД?
-------------------- There's nothing left but silent epitaphs. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |